标准 MPEG-1 第三层 (Mp3) 滤波器组失真

信息处理 过滤器组 失真 mp3
2022-01-30 04:13:32

所以,我正在使用 Matlab 中 Mp3 中使用的滤波器组。我在输出中获得了相当大的失真,我真的不知道我是否做错了什么。

我回顾了文献,我会说我做得很好,所以我真的不明白我做错了什么。

所以我的工作基于一个具有 512 个系数的滤波器,可以在第 9-13 页上找到,这里:https ://www.mp3-tech.org/programmer/docs/jacaba_main.pdf (我认为它来自一个标准,所以没什么大不了的,我猜)。

我想制作一个有 32 个分支的过滤器库。我想基于那个低通滤波器原型,计算将覆盖整个带宽的 32 个分支,所以我做:

(注意“h”是带有滤波器系数的变量)

branches=32;
hh=zeros(branches-1,length(h));
n=0:511;
for k=0:1:branches-1 
   hh(k+1,:)=h.*cos(((2*k+1)*pi*(n-16))/(2*32));
end

一个用于生成分析滤波器系数,以下一个用于合成滤波器:

branches=32;
hh=zeros(branches-1,length(h));
n=0:511;
for k=0:1:branches-1 
   hh(k+1,:)=h.*cos(((2*k+1)*pi*(n+16))/(2*32));
end

根据将滤波器应用于输入信号并重建输出信号的方式:

yy=zeros(branches,floor(length(wav_in)/32)+1)
for k=1:1:branches
  yy(k,:)=decimate(filter(hh(k,:),1,wav_in),branches);
end

这将提供一个矩阵,其中包含移位分析滤波器 ( yy) 的所有输出。

现在,为了重建信号,使用合成滤波器:(注意这是一个不同的函数,所以我们不会有变量名称的问题)

yy = zeros(1,length(xd(1,:))*32)
for k=1:1:branches
  yy=yy+(filter(hh(k,:),1,upsample(xd(k,:),branches)));
end

过滤器响应看起来不错(至少在我看来是这样): 分析滤波器组响应

合成滤波器组响应

如果我使用 1 kHz 音调作为输入,我有:

在此处输入图像描述

输出是“之后”。如您所见,信号非常失真。一般来说,我遵循“如何在 MP3 播放器中处理声音?”中的方法。由 T. Dutoit 和 N. Moreau 着。

我认为它不起作用,老实说,我对自己做错了什么一无所知。(也许我是如何应用过滤器组的?)。

1个回答

我已经测试了你的代码。

抽取和上采样阶段存在问题。当您以未抽取的速率运行分析和合成滤波器时,您将获得完美的重建(加上滤波器移位)

首先对于对群延迟敏感的应用,最好使用conv / filter功能,然后补偿群延迟。

此外,抽取函数应用低通抗混叠滤波器,考虑到它的输出是带通信号而不是低通信因此,您应该避免使用抗锯齿抽取,而是采用带通抽取策略。32 的直接二次抽样将提供令人信服的结果。k

插值部分也是如此扩展信号后,您应该通过合适的带通滤波器而不是来自传统插值器的低通滤波器来选择适当的图像频谱带。直接扩展可能会令人信服,因为它的输出稍后已经被多相滤波器组带通滤波。

话虽这么说,您的主要问题是您基于代码的文档。这远远超出了信号处理的范围。我建议你阅读 BOSI 的 MPEG 音频标准书。但这当然取决于你。

以下是经过修正的 MATLAB / OCTAVEcode

% S0 - Load the prototype lowpass filter impulse response:
% --------------------------------------------------------
load h2.mat;         % h[n] is the prototype lowpass filter... of length 512
L = length(h);

figure,subplot(2,1,1)
stem([0:L-1],h);title('The Prototype Lowpass Filter');
subplot(2,1,2)
plot(linspace(-1,1,4*L),20*log10(abs(fftshift(fft(h,4*L)))));
grid on;


% S1 - Create the 32 band filter bank by cosine modulation
% --------------------------------------------------------
numbands = 32;                  % number of bands
n=0:L-1;

hha=zeros(numbands,L);         % band of filters
for k=0:1:numbands-1 
   hha(k+1,:) = h.*cos( ( (2*k+1)*pi*(n-16) ) / (2*numbands) );
end

figure
plot(linspace(-1,1,4*L),20*log10(abs(fftshift(fft(hha(1,:),4*L)))));
title('ANALYSIS FILTER BANK');
hold on
for k=1:numbands
    plot(linspace(-1,1,4*L),20*log10(abs(fftshift(fft(hha(k,:),4*L)))));
end

% S2 - Design the synthesis filterbank:
% -------------------------------------
numbands = 32;                     % number of banks
n=0:L-1;

hhs = zeros(numbands,L);           % band of filters
for k=0:1:numbands-1 
   hhs(k+1,:) = h.*cos( ( (2*k+1)*pi*(n+16) ) / (2*numbands) );
end


% S3 - Generate a test input signal:
% ----------------------------------
N = 2*1024;      % NOTE: According to the MPEG specification a determined LENGTH must be applied.
wav_in = sin(0.05*pi*[0:N-1]);        % pure sine tone

figure,subplot(2,1,1)
plot(wav_in);title('input signal')
subplot(2,1,2)
plot(linspace(-1,1,4*N),20*log10(abs(fftshift(fft(wav_in,4*N)))));


% S4 - Apply a wav file to it,  get every output of the every sub-band:
% --------------------------------------------------------------------
yyd = zeros( numbands, floor(N/numbands));   % decimated outputs..
yyu = zeros( numbands , N);

for k=1:1:numbands
    temp = conv( wav_in,hha(k,:));
    yyu(k,:) = temp(L/2+1:L/2+N);
    yyd(k,:) = yyu(k,1:numbands:end);
end


% S6 - Apply synthesis on the decimated signal
% --------------------------------------------
ys = zeros(1, N);
yi = zeros(1,N);

for k=1:1:numbands
    yi(1:numbands:end) = yyd(k,:);
    temp = conv(yi,hhs(k,:));
    ys = ys + temp(L/2+1:L/2+N);
end
ys = numbands*ys;

% Display the result:    
figure,subplot(2,1,1)
plot(ys);title('Synthesized Back');
subplot(2,1,2)
plot(linspace(-1,1,4*N),20*log10(abs(fftshift(fft(ys,4*N)))));

输出为:

1-原型过滤器:

在此处输入图像描述

2- 32 通道滤波器组:

在此处输入图像描述

3-纯音输入:

在此处输入图像描述

4-重建的反向输出:

在此处输入图像描述