主要内容

多层螺旋ct

修正离散余弦变换

描述

例子

Y=多层螺旋ct (X的改进的离散余弦变换(MDCT)X.在计算多层螺旋ct之前,X被缓冲成50%重叠的帧,每个帧都乘以时间窗口.函数处理的每一列X作为一个独立的渠道。

例子

Y=多层螺旋ct (X名称,值每个属性集的名字到指定的价值.未指定的属性具有默认值。

Y年代Z) =多层螺旋ct (___返回修正的离散正弦变换(MDST),年代,奇数离散傅里叶变换(ODFT),Z

例子

全部折叠

读入音频文件,然后使用1024点kaiser - bessel导出窗口计算多层螺旋ct。

audioIn=audioread(“Counting-16-44p1-mono-15secs.wav”);系数=多层螺旋ct (audioIn kbdwin (1024);

绘制多层螺旋ct系数随时间变化的功率图。

冲浪(pow2db(系数。^ 2),“EdgeColor”“没有”);视图(90[0])包含(“框架”) ylabel (“频率”)轴([0大小(coef,2)0大小(coef,1)])色条

图中包含一个坐标轴。轴包含一个类型为曲面的对象。

为了实现完美的重建,多层螺旋ct功能零垫的前面和后面的音频输入信号。信号从imdct移除为完美重建而添加的零填充。

读入音频文件,创建一个2048点的kaiser - bessel导出窗口,然后剪辑音频信号,使其长度为2048的倍数。

[x, fs] = audioread (“点击- 16 - 44 - p1 - mono - 0.2 - secs.wav”);赢得= kbdwin (2048);xClipped = x(1:end - rem(size(x,1),numel(win)))); / /

把信号转换到频域,然后在时域重建它。绘制原始信号和重建信号,并显示重建误差。

C =多层螺旋ct (xClipped,赢得);y = imdct (C,赢得);图(1)t = (0:size(xClipped,1)-1)'/fs;情节(t, xClipped“波”,t,y,“r”。)传说(“原始信号”重构信号的)标题(strcat (“重建错误=”,num2str(平均值((xClipped-y)。^2)))xlabel(“时间(s)”) ylabel (“振幅”

控件可以在没有输入填充的情况下执行MDCT和IMDCTPadInput名称-值对。但是,在信号的前半帧和后半帧会出现重构误差。

C =多层螺旋ct (xClipped赢,“PadInput”、假);y = imdct (C,赢了,“PadInput”图(2)t=(0:size(xClipped,1)-1)’/fs;绘图(t,xClipped,“波”,t,y,“r”。)传说(“原始信号”重构信号的)标题(strcat ("重建错误(没有输入填充)= ",num2str(平均值((xClipped-y)。^2)))xlabel(“时间(s)”) ylabel (“振幅”

的输入信号多层螺旋ct如果不是窗长的倍数,则输入信号被填充为零。将原未裁剪信号通过变换对,并将原信号与重构信号进行比较。

C=mdct(x,win);y=imdct(C,win);图(3)子地块(2,1,1)地块(x)标题(“原始信号”) ylabel (“振幅”)轴([0,马克斯(大小(y, 1),大小(x, 1)), -0.5, 0.5])次要情节(2,1,2)情节(y)标题(重构信号的)包含(“时间(s)”) ylabel (“振幅”)轴([0,马克斯(大小(y, 1),大小(x, 1)), -0.5, 0.5))

重建信号在后端用零填充。将重构信号的零填充去除,绘制原信号和重构信号,然后显示重构误差。

图(4)y = y(1:size(x,1));t =(0:大小(x, 1) 1)”/ fs;情节(t x,“波”,t,y,“r”。)传说(“原始信号”重构信号的)标题(strcat (“重建错误=”num2str(意思是((x - y) ^ 2))))包含(“时间(s)”) ylabel (“振幅”

创建一个dsp。AudioFileReader对象以逐帧读取音频数据。创建一个信号接收器记录重建信号以作比较。创建一个dsp。AsyncBuffer缓冲输入流。

fileReader = dsp。AudioFileReader (“FunkyDrums-44p1-stereo-25秒mp3”);logger=dsp.SignalSink;buff=dsp.AsyncBuffer;

创建512点kaiser - bessel导出窗口。

N = 512;赢得= kbdwin (N);

在音频流循环中:

  1. 从文件中读取一帧数据。

  2. 将数据帧写入异步缓冲区。

  3. 如果存在半帧数据,则从缓冲区中读取数据,然后执行转换对。叠加电流输出imdct使用前面的输出,并记录结果。更新记忆。

mem = 0 (N / 2, 2);%初始化一个空内存~isDone(fileReader) audioIn = fileReader();写(浅黄色,audioIn);迷。NumUnreadSamples >= N/2 x = read(buff,N,N/2); C = mdct(x,win,“PadInput”、假);y = imdct (C,赢了,“PadInput”、假);logger(y(1:N/2,:)+mem) mem = y(N/2+1:end,:);结束结束%用填充零的最终信号最后一次执行转换对。x =阅读(迷,N, N / 2);C =多层螺旋ct (x,赢了,“PadInput”、假);y = imdct (C,赢了,“PadInput”、假);logger(y(1:N/2,:)+mem) reconstructedSignal = logger. buffer;

读取整个原始音频信号。修剪重建信号的前后零填充以便比较。绘制原始信号和重建信号的一个通道,并显示重建误差。

[originalSignal,fs]=audioread(fileReader.Filename);信号长度=大小(原始信号,1);重构信号=重构信号((N/2+1):(N/2+1)+信号长度-1,:);t=(0:大小(原始信号,1)-1)’/fs;图(t,原始信号(:,1),“波”t reconstructedSignal (: 1),“r”。)传说(“原始信号”重构信号的)标题(strcat (“重建错误=”...num2str(意思是((originalSignal-reconstructedSignal)。^ 2,“所有”))))包含(“时间(s)”) ylabel (“振幅”

图中包含一个坐标轴。标题为重建错误= 2.0761e-32的轴包含2个类型为line的对象。这些对象分别代表原始信号和重构信号。

输入参数

全部折叠

输入数组,指定为列向量或矩阵。如果指定为一个矩阵,列将被视为独立的音频通道。

数据类型:|

在时域中应用的窗口,指定为偶数长度向量。由多层螺旋ct具有与相同的点数.要实现完美重建,请使用满足普林斯-布拉德利条件的窗口( w n 2 + w n + N 2 1 ),如正弦窗或kbdwin

数据类型:|

名称-值对的观点

指定可选的逗号分隔的对名称,值论据。的名字参数名和价值为对应值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数名称1,值1,…,名称,值

例子:“PadInput”,假的

标记填充输入数组,指定为逗号分隔对,由'PadInput”,真正的.如果设置为真正的,零填充添加到输入X两端都能实现完美的重建。每一端的0数是元素个数()/2

数据类型:逻辑

输出参数

全部折叠

改进的离散余弦变换(MDCT),以向量、矩阵或三维数组的形式返回。的尺寸Yl-借--借-N,地点:

  • l——每一帧的频域表示中的点数,等于元素个数()/2

  • ——输入数组被划分的帧数。

    • 如果PadInput设置为真正的M =(2 *大小(即:X1) /元素个数() + 1

    • 如果PadInput设置为M =(2 *大小(即:X1) /元素个数(1))

  • N——通道数,等于大小(X, 2)

从输出中删除尾随的单例维度Y

数据类型:|

修改的离散正弦变换(MDST),以矢量、矩阵或三维数组的形式返回。的尺寸年代与MDCT输出相同,Y

数据类型:|

半边奇数离散傅里叶变换(ODFT),以向量、矩阵或三维复数数组的形式返回Z与MDCT输出相同,Y

要构建完整(双面)ODFT,请镜像半侧面ODFT:猫(1,Z、连词(翻转(Z, 1)))

数据类型:|
复数的支持:万博1manbetx是的

算法

改进的离散余弦变换是一种时频变换。给定一个输入信号X和窗口,多层螺旋ct函数对每个独立的通道执行以下步骤:

  1. 框架大小是指定窗口中元素的数量,N元素个数(.默认情况下,PadInput设置为真正的,输入信号X垫着N/前后2个零。如果输入信号不能被N,在背面添加额外的填充。填充后,输入信号被缓冲成50%重叠帧。

  2. 缓冲和填充输入信号的每一帧乘以窗口,

  3. 输入通过改进的离散余弦变换转换为频率表示:

    Y k n 0 N 1 X n 因为 π N 2 n + N 2 + 1 2 k + 1 2 k 0 1 ... N 2 1

为了利用FFT算法,通过首先计算奇数DFT来计算MDCT:

Y O k n 0 N 1 X n e j π n N 2 k + 1 k 0 1 ... N 1

然后计算多层螺旋ct:

Y k e Y o k 因为 π N k + 1 2 1 + N 2 k 0 1 ... N 2 1

如果从多层螺旋ct函数,也计算并返回修正的离散正弦变换(MDST):

X k X o k π N k + 1 2 1 + N 2 k 0 1 ... N 2 1

工具书类

[1] 使用基于时域混叠消除的滤波器组设计的子带/变换编码IEEE声学、语音和信号处理国际会议.1987年,页2161 - 2164。

[2]普林斯,J.和A.布拉德利。基于时域混叠消除的分析/综合滤波器组设计IEEE声学、语音和信号处理汇刊。1986年第34卷第5期第1153-1161页。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。

另请参阅

||

介绍了R2019a