主要内容

IMDCT.

反向修改离散余弦变换

描述

例子

X= IMDCT(Y返回反向修改的离散余弦变换(IMDCT)Y,然后与时间窗相乘并重叠 - 添加50%重叠的帧。

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

例子

全部收缩

在音频文件中读取,将其转换为单声道,然后绘制它。

AudioIn = audioread('funkydrums-44p1-stereo-25secs.mp3');AudioIn =卑鄙(AudioIn,2);图(1)绘图(AudioIn,'博')ylabel('振幅')Xlabel(的样本数量

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

使用4096点正弦窗口计算MDCT。绘制MDCT系数随时间的力量。

n = 4096;wdw = sin(pi *((1:n)-0.5)/ n);C = MDCT(AudioIn,WDW);图(2)冲浪(POW2DB(C. * COM(C)),“EdgeColor”'没有任何');视图(90[0])包含('框架')ylabel('频率')轴([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”。)ylabel('振幅')Xlabel(的样本数量

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

为了实现完美的重建,多层螺旋ct功能零焊接音频输入信号的正面和背面。信号返回IMDCT.移除为完美重建而添加的零填充。

在音频文件中读取,创建一个2048点Kaiser-Bessel派生窗口,然后剪辑音频信号,使其长度为2048的倍数。

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

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

C = MDCT(XCLIPPED,WIN);Y = IMDCT(C,WIN);图(1)t =(0:大小(xclife,1)-1)'/ fs;绘图(T,XCLIPPED,'博',t,y,“r”。)传说('原始信号''重建信号')标题(Strcat(“重建错误=”,num2str(平均值(((xclife-y)。^ 2))))xlabel('时间'')ylabel('振幅'

控件可以在没有输入填充的情况下执行MDCT和IMDCTPadinput.名称值对。但是,在第一半帧和信号的最后半帧中将存在重建误差。

C =多层螺旋ct (xClipped赢,“PadInput”、假);y = imdct (C,赢了,“PadInput”、假);图(2)t =(0:大小(xclife,1)-1)'/ fs;绘图(T,XCLIPPED,'博',t,y,“r”。)传说('原始信号''重建信号')标题(Strcat(“重建错误(没有输入填充)=”,num2str(平均值(((xclife-y)。^ 2))))xlabel('时间'')ylabel('振幅'

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

c = mdct(x,win);Y = IMDCT(C,WIN);图(3)子图(2,1,1)plot(x)标题('原始信号')ylabel('振幅')轴([0,max(大小(y,1),size(x,1)), -  0.5,0.5])子图(2,1,2)绘制(Y)标题('重建信号')Xlabel('时间'')ylabel('振幅')轴([0,马克斯(大小(y, 1),大小(x, 1)), -0.5, 0.5))

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

图(4)y = y(1:尺寸(x,1));t =(0:size(x,1)-1)'/ fs;绘图(t,x,'博',t,y,“r”。)传说('原始信号''重建信号')标题(Strcat(“重建错误=”num2str(意思是((x - y) ^ 2))))包含('时间'')ylabel('振幅'

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

filereader = dsp.audiofilereader('funkydrums-44p1-stereo-25secs.mp3');logger = dsp.signalsink;buff = dsp.asyncuffer;

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

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

在一个音频流循环中:

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

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

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

mem =零(n / 2,2);%初始化空存储器尽管~isDone(fileReader) audioIn = fileReader();写(浅黄色,audioIn);尽管buff.numunReadsamples> = n / 2 x =读取(buff,n,n / 2);C =多层螺旋ct (x,赢了,“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”、假);记录器(y(1:n / 2,:) + mem)reclustructedsignal = logger.buffer;

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

[OriginalSignal,FS] = audioread(Filereader.FileName);SignAllength = Size(InfericalSignal,1);RecoleStriceSignal = ReconstructedSignal((n / 2 + 1):( n / 2 + 1)+ signallength-1,:);t =(0:size(原始信号,1)-1)'/ fs;绘图(T,OriginalSignal(:,1),'博't reconstructedSignal (: 1),“r”。)传说('原始信号''重建信号')标题(Strcat(“重建错误=”...num2str(意思是((originalSignal-reconstructedSignal)。^ 2,'全部'))))包含('时间'')ylabel('振幅'

图中包含一个轴对象。具有标题重建误差= 2.0761E-32的轴对象包含2个类型的类型。这些对象代表原始信号,重建信号。

输入参数

全部收缩

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

  • l- 每个帧的频域表示中的点数。l必须是窗口中点数的一半,

  • - 框架数。

  • N——通道数量。

数据类型:|双倍的

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

数据类型:|双倍的

名称-值参数

指定可选的逗号分隔的对名称,价值论点。的名字参数名和价值是相应的价值。的名字必须出现在引号内。您可以以任何顺序指定多个名称和值对参数name1,value1,...,namen,valuen

例子:“PadInput”,假的

标志如果输入到前方多层螺旋ct是垫。如果设置为真的,输出在两端被截断,以删除前向的零填充多层螺旋ct补充道。

数据类型:逻辑

输出参数

全部收缩

输入阵列的改进离散余弦反变换(IMDCT)Y,返回为独立通道的列向量或矩阵。

数据类型:|双倍的

算法

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

  1. 输入的每个帧被转换为时域表示:

    X n k 0 N 2 1 Y k COS. π N 2 n + N 2 + 1 2 k + 1 2 n 0 1 ... N 1

    在哪里N是元素的数量

  2. 时域信号的每个帧乘以窗口,

  3. 帧与50%重叠重叠,以构造连续的时域信号。如果Padinput.被设置为真,IMDCT.功能假设正向变换中的原始输入信号(多层螺旋ct)填充了N/ 2个零在前面和背面,并卸下填充物。默认情况下,Padinput.被设定为真的

参考

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

[2]原则,J.和A. Bradley。“基于时域混叠取消分析/综合滤波器组设计。”声学,语音和信号处理的IEEE交易。卷。34,第5号,第1986号,第115.161页。

扩展功能

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

介绍了R2019a