主要内容

imdct

逆修正离散余弦变换

描述

例子

X= imdct (Y赢得的逆修正离散余弦变换(IMDCT)Y,然后进行时间窗乘法运算赢得重叠叠加50%重叠的帧。

X= imdct (Y赢得名称,值设置每个属性的名字到指定的价值.未指定的属性有默认值。

例子

全部折叠

读入音频文件,将其转换为单声道,然后绘图。

audioIn = audioread(“FunkyDrums-44p1-stereo-25secs.mp3”);audioIn = mean(audioIn,2);图(1)情节(audioIn“波”) ylabel (“振幅”)包含(的样本数量

图中包含一个轴对象。axis对象包含一个line类型的对象。

使用4096点正弦窗口计算MDCT。绘制MDCT系数随时间变化的功率图。

N = 4096;wdw = sin(pi*((1:N)-0.5)/N);C = mdct(audioIn,wdw);图(2)冲浪(pow2db (C *连词(C)),“EdgeColor”“没有”);视图([0 90])“帧”) ylabel (“频率”)轴([0 size(C,2) 0 size(C,1)])色条

图中包含一个轴对象。axis对象包含一个surface类型的对象。

将表示法转换回时域。通过计算均方误差验证完美重构性质。将重建信号绘制在原始信号上。

audioreconstruct = imdct(C,wdw);err = mean((audioIn- audioreconstruct (1:size(audioIn,1),:)).^2)
Err = 9.5937e-31
图(1)情节(audioReconstructed“r”。) ylabel (“振幅”)包含(的样本数量

图中包含一个轴对象。axis对象包含2个line类型的对象。

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

读入音频文件,创建一个2048点的凯撒贝塞尔衍生窗口,然后剪辑音频信号,使其长度为2048的倍数。

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

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

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

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

C = mdct(xClipped,win,“PadInput”、假);y = imdct(C,win,“PadInput”、假);图(2)t = (0:size(xClipped,1)-1)'/fs;情节(t, xClipped“波”、t、y,“r”。)传说(原始信号的重构信号的)标题(strcat ("重建错误(没有输入填充)= "num2str(意思是((xClipped-y) ^ 2))))包含(“时间(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:size(x,1)-1)'/fs;情节(t x,“波”、t、y,“r”。)传说(原始信号的重构信号的)标题(strcat ("重建错误= "num2str(意思是((x - y) ^ 2))))包含(“时间(s)”) ylabel (“振幅”

创建一个dsp。AudioFileReader对象逐帧读取音频数据。创建一个dsp。SignalSink对重构信号进行记录,以便进行比较。创建一个dsp。AsyncBuffer缓冲输入流。

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

创建一个512点的凯撒贝塞尔衍生窗口。

N = 512;win = 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,win,“PadInput”、假);logger(y(1:N/2,:)+mem) mem = y(N/2+1:end,:);结束结束最后一次使用零填充的最终信号执行转换对。x = read(buff,N,N/2);C = mdct(x,win,“PadInput”、假);y = imdct(C,win,“PadInput”、假);logger(y(1:N/2,:)+mem) reconstructedSignal = logger. buffer;

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

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

图中包含一个轴对象。标题为Reconstruction Error = 2.0761e-32的axes对象包含2个类型为line的对象。这些对象分别代表原始信号、重构信号。

输入参数

全部折叠

修改的离散余弦变换(MDCT),指定为矢量、矩阵或3-D数组。的维度Y被解释为多层螺旋ct函数。如果Y是一个l——- - - - - -——- - - - - -N数组时,维数解释为:

  • l——每帧频域表示中的点数。l一定是窗口点数的一半,赢得

  • ——帧数。

  • N——通道数量。

数据类型:|

窗口应用于时域,指定为向量。赢的长度必须是赢的行数的两倍Y元素个数(赢得) = = 2 *大小(Y,1).要实现完美的重构,请使用前向转换中使用的相同窗口多层螺旋ct

数据类型:|

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

例子:“PadInput”,假的

如果输入到转发,则标记多层螺旋ct是垫。如果设置为真正的时,输出在两端被截断以去除前向的零填充多层螺旋ct补充道。

数据类型:逻辑

输出参数

全部折叠

输入数组的逆修正离散余弦变换(IMDCT)Y,作为独立通道的列向量或矩阵返回。

数据类型:|

算法

逆修正离散余弦变换是一种时频变换。给定一个频域输入信号Y和窗口赢得,imdct函数对每个独立通道执行以下步骤:

  1. 输入的每一帧都转换为时域表示:

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

    在哪里N元素的个数是多少赢得

  2. 时域信号的每一帧都乘以窗口,赢得

  3. 这些帧以50%的重叠叠加构成一个连续的时域信号。如果PadInput设置为true时,imdct函数假设正变换中的原始输入信号为(多层螺旋ct)里面垫着N/2 0在前面和后面,并删除填充。默认情况下,PadInput设置为真正的

参考文献

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

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

扩展功能

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

版本历史

在R2019a中引入