MDCT

修正离散余弦变换

说明

ÿ= MDCT(X赢得返回的修改的离散余弦变换(MDCT)X。该MDCT计算之前,X被缓存到50%重叠的帧,其各自乘以时间窗赢得。函数对待的每一列X作为一个独立的信道。

ÿ= MDCT(X赢得名称,值设置每个属性姓名到指定的。未指定的属性具有默认值。

[ÿ小号ž]=mdct(___返回修正的离散正弦变换(MDST),小号和奇数离散傅立叶变换(ODFT),ž

实例

全部收缩

读取音频文件,然后使用1024点Kaiser-Bessel衍生窗口计算MDCT。

audioIn = audioread ('计数-16-44p1单 -  15secs.wav');COEF = MDCT(AUDIOIN,kbdwin(1024));

画出MDCT系数的功率随时间。

冲浪(20×log10(系数2),'EdgeColor''没有');视图([0 90])xlabel(“帧”)伊拉贝尔('频率')轴([0 size(coef,2) 0 size(coef,1)])颜色条

为了实现完美的重建,MDCT功能零垫音频输入信号的前部和后部。信号从imdct公司移除添加完全重构的零填充。

读入音频文件,创建2048点Kaiser-Bessel衍生窗口,然后剪辑音频信号,使其长度为2048的倍数。

[x,fs]=音频读取('单击-16-44p1-mono-0.2secs.wav');赢= kbdwin(2048);xClipped = X(1:结束 -  REM(尺寸(X,1),numel(WIN)));

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

C=mdct(xClipped,win);y=imdct(C,win);图(1)t=(0:size(xClipped,1)-1)’/fs;plot(t,xClipped,“波”、t、y,'R'。)传说(原始信号的“重构信号”)标题(strcat的("重构错误= "num2str(意思是((xClipped-y) ^ 2))))包含('时间(s)')伊拉贝尔(“振幅”

您可以使用焊盘输入名称 - 值对。然而,将在第一半帧和信号的最后半帧的重构误差。

C = MDCT(xClipped,获胜,'输入',错误);y=imdct(C,win,'输入'、假);图(2)t = (0:size(xClipped,1)-1)'/fs;情节(t, xClipped“波”、t、y,'R'。)传说(原始信号的“重构信号”)标题(strcat的(“重构误差(无输入填充)=”num2str(意思是((xClipped-y) ^ 2))))包含('时间(s)')伊拉贝尔(“振幅”

如果您指定的输入信号MDCT这不是窗口长度的倍数,则输入信号被用零填充。通过变换对传递原始信号未截短的和比较原始信号和重构信号。

C =多层螺旋ct (x,赢得);y = imdct (C,赢得);图(3)subplot(2,1,1) plot(x) title(原始信号的)伊拉贝尔(“振幅”)轴([0,MAX(大小(Y,1),大小(X,1)), -  0.5,0.5])副区(2,1,2)曲线图(y)的标题(“重构信号”)xlabel公司('时间(s)')伊拉贝尔(“振幅”)轴([0,max(大小(y,1),大小(x,1)),-0.5,0.5])

重构信号被填充与在后端零。从重构信号中除去补零,情节原始和重构信号,然后显示重构误差。

图(4)y=y(1:尺寸(x,1));t=(0:尺寸(x,1)-1)’/fs;plot(t,x,“波”、t、y,'R'。)传说(原始信号的“重构信号”)标题(strcat的("重构错误= ",num2str(均值((X-Y)。^ 2))))xlabel('时间(s)')伊拉贝尔(“振幅”

创建一个dsp.AudioFileReader对象中的音频数据以读取一帧一帧。创建一个dsp.SignalSink记录重建信号进行比较。创建异步缓冲区缓冲输入流。

的FileReader = dsp.AudioFileReader(“FunkyDrums-44p1-stereo-25secs.mp3”);记录器= dsp.SignalSink;浅黄色= dsp.AsyncBuffer;

创建一个512点Kaiser-Bessel派生窗口。

N=512;win=kbdwin(N);

在音频流循环中:

  1. 读取数据从文件的框架。

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

  3. 如果存在半帧数据,则从缓冲区读取,然后执行变换对。重叠添加当前输出imdct公司使用上一个输出,并记录结果。更新内存。

mem=零(N/2,2);%初始化一个空存储器〜isDone(的FileReader)AUDIOIN =的FileReader();写(浅黄色,AUDIOIN);buff.NumUnreadSamples> = N / 2×=读(浅黄色,N,N / 2);C = MDCT(X,获胜,'输入',错误);y=imdct(C,win,'输入',false);记录器(y(1:N/2,:)+mem)mem=y(N/2+1:end,:);结束结束%最后一次使用零填充的最终信号执行变换对。X =读(浅黄色,N,N / 2);C = MDCT(X,获胜,'输入',错误);y=imdct(C,win,'输入',false);logger(y(1:N/2,:)+mem)重建信号=logger.Buffer;

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

[originalSignal, fs] = audioread (fileReader.Filename);signalLength =大小(originalSignal, 1);reconstructedSignal = reconstructedSignal ((N / 2 + 1): (N / 2 + 1) + signalLength-1:);t =(0:大小(originalSignal, 1) 1)”/ fs;情节(t, originalSignal (: 1),“波”,t,重建信号(:,1),'R'。)传说(原始信号的“重构信号”)标题(strcat的("重构错误= "...num2str(平均值(原始信号重建信号)。^2,'所有'))))xlabel('时间(s)')伊拉贝尔(“振幅”

输入参数

全部收缩

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

数据类型:单一的|双重的

在时间域中应用的窗口,指定为偶数长度向量。由执行的转换MDCT有相同的点数吗赢得. 要实现完美的重建,请使用满足Princen-Bradley条件的窗口( w ^ ñ 2 + w ^ ñ + ñ 2 = 1 ),诸如正弦窗口或克德温

数据类型:单一的|双重的

名称 - 值对参数

指定可选的用逗号分隔的对名称,值参数。姓名是参数的名称和是相应的值。姓名必须出现引号内。您可以按照任何顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:“PadInput”,错误

标志垫输入阵列,指定为逗号分隔的一对组成的“焊盘输入“和真正。如果设置为真正,将零填充添加到输入X在两端,以使完美的重构。零的在每一端的数量是numel(赢得)/ 2

数据类型:合乎逻辑

输出参数

全部收缩

改进离散余弦变换(MDCT),返回作为矢量,矩阵,或3-d阵列。的尺寸ÿ大号——- - - - - -中号——- - - - - -ñ,其中:

  • 大号- 在每个帧的频域表示的点数,等于numel(赢得)/ 2

  • 中号–将输入数组分区到的帧数。

    • 如果焊盘输入被设置为真正M =小区(2 *尺寸(X,1)/ numel(赢得))+1个

    • 如果焊盘输入被设置为M =小区(2 *尺寸(X,1)/ numel(赢得))-1个

  • ñ- 通道数,等于大小(X,2个)

从输出中删除后续的单变量维度ÿ

数据类型:单一的|双重的

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

数据类型:单一的|双重的

半边奇数离散傅里叶变换(ODFT),作为向量、矩阵或复数的三维数组返回。的尺寸ž与MDCT输出相同,ÿ

为了构造完整的(双面)ODFT,镜像半面ODFT:类别(1,ž,连词(翻转(ž,1)))

数据类型:单一的|双重的
复数支持:万博1manbetx是的

算法

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

  1. 帧大小是指定窗口中的元素数,ñ=numel(赢得。默认情况下,焊盘输入被设置为真正,所以输入信号X有填充物ñ前面和后面都是0。如果输入信号不能被整除ñ,额外的填充是在背面加入。填充之后,输入信号被缓冲到50%的重叠的帧。

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

  3. 使用修改后的离散余弦变换将输入转换为频率表示:

    ÿ ķ = ñ = 0 ñ 1 X ñ COS [ π ñ 2 ñ + ñ 2 + 1 2 ķ + 1 2 ] ķ = 0 1 ... ñ 2 1

为了利用FFT算法,MDCT首先计算奇次DFT:

ÿ Ø ķ = ñ = 0 ñ 1 X ñ Ë Ĵ π ñ ñ 2 ķ + 1 ķ = 0 1 ... ñ 1

然后计算MDCT:

ÿ ķ = Ë { ÿ Ø ķ } COS π ñ ķ + 1 2 1 + ñ 2 ķ = 0 1 ... ñ 2 1

方法请求的第二个参数MDCT函数,还将计算并返回修改的离散正弦变换(MDST):

X ķ = { X Ø ķ } π ñ ķ + 1 2 1 + ñ 2 ķ = 0 1 ... ñ 2 1

参考文献

普林斯顿,J., A.约翰逊,和A.布拉德利。使用基于时域混叠消除的滤波器组设计的子带/变换编码。IEEE国际会议声学,语音和信号处理(ICASSP)。1987年,第2161至2164年。

[2] Princen,J.,和A.布拉德利。“时域混叠消除的分析/合成滤波器组设计为主。”IEEE声学、语音和信号处理事务。第34卷,1986年第5期,第1153-1161页。

扩展功能

C/C++代码生成
生成使用MATLAB®编码器™C和C ++代码。

也可以看看

||

介绍了在R2019a