主要内容

多层螺旋ct

修改离散余弦变换

描述

例子

Y=多层螺旋ct (X,赢得)返回修改的离散余弦变换(MDCT)X。在计算多层螺旋ct之前,X是否被缓冲成50%重叠的帧,每个帧都乘以时间窗口赢得。函数处理的每一列X作为一个独立的渠道。

例子

Y=多层螺旋ct (X,赢得,名称,值)每个属性集名称到了指定的价值。未指定的属性具有默认值。

(Y,年代,Z] = mdct(___)返回修改的离散正弦变换(MDST),年代,而奇离散傅里叶变换(ODFT),Z

例子

全部折叠

在音频文件中读取,然后使用1024点kaiser-bessel派生窗口计算MDCT。

audioIn = audioread (“Counting-16-44p1-mono-15secs.wav”);系数=多层螺旋ct (audioIn kbdwin (1024);

绘制多层螺旋ct系数随时间的幂。

冲浪(20 * log10(cof. ^ 2),“EdgeColor”,“没有”);视图(90[0])包含(“帧”)ylabel(“频率”)轴([0尺寸(cof,2)0尺寸(cof,1)])颜色栏

为了实现完美的重建多层螺旋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,赢得);图(1)t =(0:大小(xclife,1)-1)'/ fs;绘图(T,XCLIPPED,“波”、t、y,“r”。)传奇(原始信号的,重构信号的)标题(strcat ("重构误差= "num2str(意思是((xClipped-y) ^ 2))))包含(“时间(s)”)ylabel(“振幅”)

您可以使用使用输入填充的MDCT和IMDCT执行MDCT和IMDCTPadinput.名称-值对。但是,在信号的前半帧和后半帧会有重构错误。

C =多层螺旋ct (xClipped赢,'padinput'、假);Y = IMDCT(C,WIN,'padinput'、假);图(2)t = (0:size(xclip,1)-1)'/fs;绘图(T,XCLIPPED,“波”、t、y,“r”。)传奇(原始信号的,重构信号的)标题(strcat ("重构错误(没有输入填充)= "num2str(意思是((xClipped-y) ^ 2))))包含(“时间(s)”)ylabel(“振幅”)

如果你指定一个输入信号到多层螺旋ct这不是窗口长度的倍数,那么输入信号就用0填充。将原未删减信号通过变换对,比较原信号和重构信号。

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)标题(重构信号的)xlabel(“时间(s)”)ylabel(“振幅”)轴([0,max(大小(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))))包含(“时间(s)”)ylabel(“振幅”)

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

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);迷。NumUnreadSamples >= N/2 x = read(buff,N,N/2); C = mdct(x,win,'padinput'、假);Y = IMDCT(C,WIN,'padinput'、假);记录器(y(1:n / 2,:) + mem)mem = y(n / 2 + 1:结束,:);结束结束最后一次使用零填充最终信号执行变换对。x =阅读(迷,N, N / 2);C =多层螺旋ct (x,赢了,'padinput'、假);Y = IMDCT(C,WIN,'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,重建次数(:,1),“r”。)传奇(原始信号的,重构信号的)标题(strcat ("重构误差= ",......num2str(平均值((原始的 - 重建)。^ 2,“所有”))))包含(“时间(s)”)ylabel(“振幅”)

输入参数

全部折叠

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

数据类型:|

在时域中应用的窗口,指定为偶数矢量。转换执行多层螺旋ct有相同的点数吗赢得。为了实现完美的重建,请使用满足普林森 - 布拉德利条件的窗口( w n 2 + w n + N 2 = 1 ),如正弦窗口或kbdwin.

数据类型:|

名称-值对的观点

指定可选的,以逗号分隔的对名称,值论点。名称参数name和价值是相应的价值。名称必须出现在引号内。可以按任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例:'padinput',false

标记填充输入数组,指定为由'Padinput.”,真正的要么。如果设置为真正的,将零填充添加到输入中X两端都能进行完美的重建。两端的0个数为元素个数(赢得) / 2

数据类型:逻辑

输出参数

全部折叠

修改的离散余弦变换(MDCT),作为向量、矩阵或三维数组返回。的尺寸Yl-通过--通过-N,其中:

  • l——每帧频域表示中的点个数,等于元素个数(赢得) / 2

  • - 输入数组被分区的帧数。

    • 如果Padinput.被设置为真正的,M =(2 *大小(即:X1) /元素个数(赢得)))+ 1

    • 如果Padinput.被设置为,M =(2 *大小(即:X1) /元素个数(赢得)) - 1

  • N——通道数,等于尺寸(X2)

从输出中取出尾随单例尺寸Y

数据类型:|

修改的离散正弦变换(MDST),返回为向量,矩阵或3-D阵列。的尺寸年代与MDCT输出相同,Y

数据类型:|

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

为了构造完整的(双面)ODFT,镜像半边ODFT:猫(1,Z、连词(翻转(Z,1)))

数据类型:|
复数的支持:金宝app

算法

修改的离散余弦变换是一个时频变换。给定输入信号X和窗口赢得,多层螺旋ct函数对每个独立频道执行以下步骤:

  1. 帧大小是指定窗口中的元素数,N=元素个数(赢得)。默认情况下,Padinput.被设置为真正的,所以输入信号X填充了N前面和后面各有2个零。如果输入信号不能被N,在背面增加额外的填充物。填充之后,输入信号被缓冲成50%的重叠帧。

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

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

    Y ( k ) = σ. n = 0 N - 1 X ( n ) 因为 ( π ( N 2 ) ( n + ( N 2 ) + 1 2 ) ( k + 1 2 ) ] , k = 0 , 1 , ...... , ( N 2 ) - 1

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

Y O ( k ) = σ. n = 0 N - 1 X ( n ) e - j π n N ( 2 k + 1 ) , k = 0 , 1 , ...... , N - 1

计算多层螺旋ct:

Y ( k ) = e { Y o ( k ) } 因为 ( π N ( k + 1 2 ) ( 1 + N 2 ) ) , k = 0 , 1 , ...... , ( N 2 ) - 1

函数请求第二个参数时多层螺旋ct功能,修改的离散正弦变换(MDST)也被计算并返回:

X ( k ) = { X o ( k ) } ( π N ( k + 1 2 ) ( 1 + N 2 ) ) , k = 0 , 1 , ...... , ( N 2 ) - 1

参考文献

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

J.和A.布拉德利。基于时域混叠消除的分析/合成滤波器组设计声学,语音和信号处理的IEEE交易。卷。34,第5号,第1986号,第115.161页。

扩展能力

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

另请参阅

||

介绍了R2019a