多相滤波器分解。它不工作

信息处理 过滤 声音 数字滤波器 多相
2022-02-15 12:58:51

所以,我想做一个滤波器组的多相实现(我从一开始就遇到了问题,过去我已经向社区寻求帮助,确实:Norm MPEG-1 Layer III (Mp3) Filter banks distortion) . 多亏了支持,我才能使它工作(没有多相实现)。

尽管如此,我还是尝试通过多相滤波器组来完成所有的分析滤波器和合成滤波器,如下所示:

从: 在此处输入图像描述

到: 在此处输入图像描述

这个想法基本上是基于第一张图片,用余弦调制的低通滤波器原型使滤波器响应的频移覆盖所有带宽(使用 32 个滤波器),将每个特定的滤波器响应分解为 32 个多相分支.

(所以32个分支,是通过将原型乘以一个余弦来移动得到的。这32个分支中的每一个都是通过将每个分析和合成滤波器分解为32个多相分支来实现的)。

因此,一旦第一部分工作(即未通过多相滤波器组实现的滤波器组),我将按如下方式进行多相分解:

1.多相分解

  • h是组中每个滤波器的调制系数。
  • hh是多相滤波器组系数
  • 矩阵的第滤波器的系数ithith
  • M是多相滤波器分支,在我们的示例中为 32
    hh=零(M,长度(h)/M);
    对于 l=0:1:M-1
    n=l+1:M:长度(h);
    hh(l+1,:)=h(n);
    结尾
    结尾

2.移位()由执行如下的函数执行(“延迟”是要应用的延迟。例如,如果要延迟 0 个样本,则输出应等于输入) :Z1

  • in_data: 输入序列
  • out_data:输出序列。
    delay_samp=延迟+1;
    out_data=zeros(1,length(in_data));
    out_data(delay_samp:length(in_data))=in_data(1:length(in_data)-(delay_samp-1));

3.好的,现在,我按如下方式应用过滤器:

分析:

yy=zeros(branches,length(hh(1,:))+fix(length(in_signal)/branches));

对于 k=1:分支

    %1。转移
    shift_input=shift_data(in_signal,k-1);

    %2。下采样
    临时=零(1,修复(长度(in_signal)/分支));
    downsampled_data=shifted_input(1:branches:end);

    临时(1:长度(下采样数据))=下采样数据;
    shift_downsampled_input=temp;

    %3。筛选
    temp=conv(hh(k,:),shifted_downsampled_input);
    yy(k,:)=温度;

结尾

和合成:

yy=zeros(branches,branches*(length(hh(1,:))+length(in_signal)-1));

对于 k=1:分支

    %1。筛选
    temp_conv=conv(hh(k,:),in_signal);

    %2。上采样
    临时=零(1,长度(temp_conv)*分支);
    temp(1:branches:end)=temp_conv;%upsample(temp,branches);

    %3。转移。
    yy(k,:)=shift_data(temp,branches-(k-1));

结尾

结果非常扭曲: 在此处输入图像描述

以 1KHz 音调作为输入的输出: 在此处输入图像描述

我想我在上采样和下采样过程中做错了,因为在第二个示例中都有光谱副本,但我不知道到底出了什么问题。

我在互联网上查了一下,还查了另一篇文章中提到的参考资料。我是说这本书但我认为我的编码方式存在问题,而不是理论上的支持。

这是低通滤波器的原型

1个回答

以下是使用相关 32 通道分析和合成滤波器组的 32 分量多相分解的工作代码。正如我已经评论过的,由于信号和滤波器长度较短,这种 CAE 的速度增益并不显着。然而,进一步的架构改进以及编码优化可以提供更好的结果。

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

% S1 - Create the 32 x 512 analysis filter-bank hha[k,n] by cosine modulation from protoype :
% -----------------------------------------------------------------------------------------
numbands = 32;                 % number of banks (channels)
n=0:L-1;

hha=zeros(numbands,L);         % bank of filters hha[k,n] = 32 x 512 array.
for k=0:1:numbands-1 
   hha(k+1,:) = h.*cos( ( (2*k+1)*pi*(n-16) ) / (2*numbands) );
end


% S2 - Create the 32-polyphase components hhap[k,m,n] , for each one of 32 analysis filters hha[k,n]:
% ---------------------------------------------------------------------------------------------------
numpoly = numbands;             % polyphase component number = decimation ratio = number of channels
hhap = zeros(numbands,numpoly, L/numpoly);  % hhap = 32 x 32 x 512/32 , 3D ANALYSIS filter bank array

M = numpoly;                    % polyphase system decimation ratio
for k=1:numbands
    for m = 1:numpoly
        hhap(k,m,:) = hha(k,m:M:end);       % create the m-th polyphase component of k-th channel filter
    end
end


% S3 - Design the 32 x 512  synthesis (complementary) filter bank :
% -----------------------------------------------------------------
numbands = 32;                  % number of banks
n=0:L-1;
hhs = zeros(numbands,L);        % bank of filters
for k=0:1:numbands-1 
   hhs(k+1,:) = h.*cos( ( (2*k+1)*pi*(n+16) ) / (2*numbands) );
end


% S4 - Obtain the 32-polyphase components hhsp[k,m,n] , for each one of 32 synthesis filters hhs[k,n]:
% ----------------------------------------------------------------------------------------------------
numpoly = numbands;             % polyphase component number = interpolation ratio = number of channels
hhsp = zeros(numbands,numpoly, L/numpoly);  % hhap = 32 x 32 x 512/32 , 3D ANALYSIS filter bank array
M = numpoly;                    % polyphase system decimation ratio
for k=1:numbands
    for m = 1:numpoly
        hhsp(k,m,:) = hhs(k,m:M:end);       % create the m-th polyphase component of k-th channel filter
    end
end


% S5 - Generate the test input signal
% -----------------------------------
N = 2*1024;
wav_in = cos(0.01791*pi*[0:N-1]);        % pure sine tone

% S6 - Apply test signal to the filterbank: ANALYSIS STAGE :
% -----------------------------------------------------------
yyd = zeros( numbands, floor(N/numbands));   % decimated outputs..
M = numbands;
for k=1:1:numbands       
    temp = conv([wav_in(1:M:end),0] , hhap(k,1,:));
    for m=2:M
        temp = temp + conv([0,wav_in(M-m+2:M:end)],hhap(k,m,:));   
    end
    yyd(k,:) = temp(L/(2*M)+1 : L/(2*M)+N/numbands);
end

% S7 - Apply SYNTHESIS filterbank on the decimated signal :
% ---------------------------------------------------------
ys = zeros(1, N);

for k=1:numbands
    temp = zeros(1, N+L-1);
    for m = 1:numpoly
        temp(m:numbands:end-31) = conv( yyd(k,:) , hhsp(k,m,:) );
    end

    ys = ys + temp(L/2+1:L/2+N);    
end
ys = numbands*ys;


% SX - DISPLAY RESULTS:
% ---------------------
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;

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

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)))));

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)))));