主要内容

imdct

反修正离散余弦变换

描述

例子

X= imdct (Y的逆修正离散余弦变换(IMDCT)Y,然后与时间窗相乘和重叠添加具有50%重叠的帧。

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

例子

全部折叠

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

audioIn=audioread(“FunkyDrums-44p1-stereo-25秒mp3”);audioIn =意味着(audioIn, 2);图(1)情节(audioIn“波”)伊拉贝尔(“振幅”)xlabel(的样本数量

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

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

N = 4096;wdw =罪(π* (-0.5 (1:N)) / N);C =多层螺旋ct (audioIn wdw);图(2)冲浪(pow2db (C *连词(C)),“EdgeColor”“没有”);视图(90[0])包含(“帧”)伊拉贝尔(“频率”)轴([0 size(C,2) 0 size(C,1)]) colorbar

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

将表示形式转换回时域。通过计算均方误差验证了重构的完美性。在原始信号上画出重建信号。

audioReconstructed = imdct (C, wdw);呃=意味着((audioIn-audioReconstructed(1:尺寸(audioIn 1):)) ^ 2)。
呃= 9.5937 e-31
图(1)在…上情节(audioReconstructed“r”。)伊拉贝尔(“振幅”)xlabel(的样本数量

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

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

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

[x, fs] = audioread ('单击-16-44p1-mono-0.2秒波形');赢得= 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)”)伊拉贝尔(“振幅”

控件可以在没有输入填充的情况下执行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)”)伊拉贝尔(“振幅”

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

C =多层螺旋ct (x,赢得);y = imdct (C,赢得);图(3)子图(2,1,1)plot(x) title(原始信号的)伊拉贝尔(“振幅”)轴([0,马克斯(大小(y, 1),大小(x, 1)), -0.5, 0.5])次要情节(2,1,2)情节(y)标题(重构信号的)xlabel(“时间(s)”)伊拉贝尔(“振幅”)轴([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)”)伊拉贝尔(“振幅”

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

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

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

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

在音频流循环中:

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

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

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

mem=零(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);signalLength =大小(originalSignal, 1);reconstructedSignal = reconstructedSignal ((N / 2 + 1): (N / 2 + 1) + signalLength-1:);t =(0:大小(originalSignal, 1) 1)”/ fs;情节(t, originalSignal (: 1),“波”t reconstructedSignal (: 1),“r”。)传说(原始信号的重构信号的)标题(strcat (“重建错误=”...num2str(意思是((originalSignal-reconstructedSignal)。^ 2,“所有”))))包含(“时间(s)”)伊拉贝尔(“振幅”

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

输入参数

全部折叠

修改的离散余弦变换(MDCT),指定为向量、矩阵或三维阵列。的尺寸Y被解释为来自多层螺旋ct函数。如果Y是一个l——- - - - - -——- - - - - -N数组,其维数解释为:

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

  • ——帧数。

  • N——通道数量。

数据类型:|

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

数据类型:|

名称-值参数

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

例子:“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在前面和后面的零,并删除填充。默认情况下,PadInput被设置为真正的

工具书类

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

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

扩展功能

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

介绍了R2019a