主要内容

imdct

逆离散余弦变换修改

自从R2019a

描述

例子

X= imdct (Y,赢得)返回修改逆离散余弦变换(IMDCT)Y随着时间的推移,紧随其后的是乘法窗口赢得和overlap-addition帧有50%的重叠。

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

例子

全部折叠

读入一个音频文件,把它转换成mono,然后情节。

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

图包含一个坐标轴对象。坐标轴对象包含样本数量,ylabel振幅包含一行对象显示它的值只使用标记。

计算多层螺旋ct使用正弦窗4096点。多层螺旋ct系数随着时间的力量。

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

图包含一个坐标轴对象。坐标轴对象包含框架,ylabel频率包含一个类型的对象的表面。

变换回时域的表示。验证完美重建属性通过计算均方误差。画出原始信号重构信号。

audioReconstructed = imdct (C, wdw);呃=意味着((audioIn-audioReconstructed(1:尺寸(audioIn 1):)) ^ 2)。
呃= 9.5937 e-31
图(1)情节(audioReconstructed“r”。)ylabel (“振幅”)包含(的样本数量)

图包含一个坐标轴对象。坐标轴对象包含样本数量,ylabel振幅包含2线类型的对象。一个或多个行显示的值只使用标记

使完美的重建,多层螺旋ct函数在正面和背面的音频输入信号。返回的信号imdct消除了补零添加完美重建。

读入一个音频文件,创建一个2048点Kaiser-Bessel-derived窗口,然后剪辑音频信号,它的长度是2048的倍数。

[x, fs] = audioread (“点击- 16 - 44 - p1 - mono - 0.2 - secs.wav”);赢得= kbdwin (2048);xClipped = x(1:结束-快速眼动(大小(x, 1),元素个数(赢得)));

将信号转换成频域,然后在时域重建。情节原始和重构信号并显示重建误差。

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

您可以执行MDCT和IMDCT没有输入填充使用PadInput名称-值对。然而,这将是一个重建误差在第一half-frame最后half-frame的信号。

C =多层螺旋ct (xClipped赢,“PadInput”、假);y = imdct (C,赢了,“PadInput”、假);图(2)t =(0:大小(xClipped, 1) 1)”/ fs;情节(t, xClipped“波”、t、y,“r”。)传说(原始信号的,重构信号的)标题(strcat (“重建错误(不输入填充)= "num2str(意思是((xClipped-y) ^ 2))))包含(“时间(s)”)ylabel (“振幅”)

如果你指定一个输入信号多层螺旋ct不是一个多个窗口的长度,然后输入信号与零填充。原始未剪短的信号通过转换和比较原始信号和重建信号。

C =多层螺旋ct (x,赢得);y = imdct (C,赢得);图(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:尺寸(x, 1));t =(0:大小(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”);记录器= dsp.SignalSink;浅黄色= dsp.AsyncBuffer;

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

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

在一个音频流循环:

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

  2. 编写异步的数据帧缓冲区。

  3. 如果半帧的数据存在,从缓冲区读取,然后执行变换对。当前输出交叠相加imdct与前面的输出,并记录结果。更新记忆。

mem = 0 (N / 2, 2);%初始化一个空的记忆~结束(fileReader) audioIn = fileReader ();写(浅黄色,audioIn);迷。NumUnreadSamples >= N/2 x = read(buff,N,N/2); C = mdct(x,win,“PadInput”、假);y = imdct (C,赢了,“PadInput”、假);记录器(y (: 1: N / 2) + mem) mem = y (N / 2 + 1:最终,);结束结束%执行变换两人最后一次在最后的信号。x =阅读(迷,N, N / 2);C =多层螺旋ct (x,赢了,“PadInput”、假);y = imdct (C,赢了,“PadInput”、假);记录器(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)”)ylabel (“振幅”)

图包含一个坐标轴对象。坐标轴对象与标题重建误差= 2.0761 e-32,包含时间(s), ylabel振幅包含2线类型的对象。一个或多个行显示的值只使用这些对象标记代表原始信号,重构信号。

输入参数

全部折叠

改进离散余弦变换(MDCT),指定为一个向量,矩阵,或三维数组。的尺寸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%重叠overlap-added构造一个连续的时域信号。如果PadInput被设置为true,imdct函数假设提出的原始输入信号变换(多层螺旋ct)填充了N/ 2 0前后和消除了填充。默认情况下,PadInput被设置为真正的

引用

[1]Princen, J。,A. Johnson, and A. Bradley. "Subband/Transform Coding Using Filter Bank Designs Based on Time Domain Aliasing Cancellation."IEEE国际会议音响、演讲和信号处理(ICASSP)。1987年,页2161 - 2164。

[2]Princen, J。,and A. Bradley. "Analysis/Synthesis Filter Bank Design Based on Time Domain Aliasing Cancellation."IEEE声学,演讲,和信号处理。34卷,问题5,1986年,页1153 - 1161。

扩展功能

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

版本历史

介绍了R2019a