再議Uniform FFT modulated filterbank

前面寫過一篇文章,但是感覺對於FFT 的filterbak還是沒有說清楚,這邊就再次把自己的一些理解說一下

1、這裏麪包含的幾個概念

uniform,說明就是基礎濾波器就一個,其他濾波器是它的一個變體,也就是調製(modulated)出來的,

polyphase分解,多相分解,主要目的是同一個多相組裏面對應的“延遲“”是一樣的,等會我後面會詳細揭祕

2、FFT幹嘛?只爲了在analysis和 synthesis架設一個橋樑,實際上是analysis 就是簡單濾波,通過濾波器

這每個channel出去的 不是你理解的變成頻域上的 X(0) X(1),...X(fft_len-1),它是每個子帶的 時域表達(直接濾波的結果),那爲什麼要求IDFT,是因爲多相分解和調製的聯合作用,“顯得“而且“剛好” 可用一個IDFT來表達

3、fir濾波器的線性相位,一般設計的fir都是線性相位的,線性相位的 h(n),它的頭尾是對稱的,用科學的話就是 偶對稱或者奇對稱,那爲什麼線性相位和對稱有關係?具體可以看這個論文:

https://www.cnblogs.com/fall-li/p/4418646.html

4、我們舉一個例子:

設計一個濾波器組,32個子帶,它的原型濾波器截止到1/32 (對0~2*pi來說)

注意這個是全頻帶的,所謂的分32個子帶是包括 fs/2~fs 的那一段的

濾波器調製公式

Hk = H0(z*exp(-j*2*pi*k/N))  k是第幾個子帶,從0開始,N是你一共有幾個子帶,(注意N不是說你濾波器tap數目)

或者說這麼寫 hk(i) = sigma i [exp(2*pi/M*k*i)*f(i)]  , i=0~N-1  (因爲H0(z)都是Z^-1的組合,z*exp(-j*2*pi*k/N代入後負數符號被幹掉了,這裏面的N又是濾波器長度

那麼8個子帶有了:它的順序如下圖:

實際上,Hk = H0(z*exp(j*2*pi*k/N))  也是可以的,注意exp中沒有負號了,它的子帶濾波器的頻帶分配如下:

所以說上面那個圖裏面的分析部分的FFT和合成部分IFFT都是沒有問題的,意思是你先 分析用IDFT,合成用DFT或者先分析用DFT,後面再合成用IDFT都是可以的

原因上面說了

Hk = H0(z*exp(-j*2*pi*k/N))  這是一種調製,對應IDFT

Hk = H0(z*exp(j*2*pi*k/N)) 這也是一種調製對應DFT

但是你要記住的是filterbank 的index是不一樣的。他們對應的頻帶部分是不一樣的。具體看上面的頻帶分配圖

所以也不用奇怪糾結各種文獻中的這個DFT和IDFT的先後次序問題了

5、另外說一個 FFT的 matrix變換方法:下面兩個在matlab中是驗證沒有問題的,那麼fft也就是可以用矩陣的方法來求,X是列向量

 fft(x) = dftmtx(n)*x;
 ifft(x) = conj(dftmtx(n))/n * x

6、舉一個實際的例子:

input FIFO

filter已經分成 8組(或者8channel)多相濾波,每組 taps數目是3個,【不要認爲這就是每個channel的濾波器係數,根本就不是,它只是假象而已

 他們對應相乘,每個ei都是多相part,另外 如果所有的e求和,實際就是 x(n) 卷積 f(n),明眼人看出來就是濾波

 %  e7 = [ x16*f7 + x8*f15 + x0*f23
%  e6=    x17*f6 + x9*f14 + x1*f22
%  e5=    x18*f5 + x10*f13 + x2*f21
%  e4=    x19*f4 + x11*f12 + x3*f20
%  e3=    x20*f3 + x12*f11 + x4*f19
%  e2 =   x21*f2 + x13*f10 + x5*f18
%  e1 =   x22*f1 + x14*f9 + x6*f17
%  e0 =   x23*f0 + x15*f8 + x7*f16 ]

容易求得 IDFT的變換矩陣是:

先算DFT的D(D是變換矩陣)

n = 8;
f = 2*pi/8;                 % Angular increment.
w = (0:f:2*pi-f/2).' * 1i;  % Column.
x = 0:n-1;                  % Row.
D = exp(-w*x);              % Exponentiation of outer product.

IDFT的爲 conj(dftmtx(n))/n = conj(D)/n

如果用 matrix 矩陣和多相矩陣 相乘:也即(方陣)*(列陣列)

結果中間的每一行是:(每個濾波器或者每個通道的輸出)

 h0_part =sigma (1/8)*exp(2*pi/8*0*[0 1 2 3 4 5 6 7]).*[e7 e6 e5 e4 e3 e2 e1 e0];
 h1_part =sigma (1/8)*exp(2*pi/8*1*[0 1 2 3 4 5 6 7]).*[e7 e6 e5 e4 e3 e2 e1 e0];

後面以此類推。。。

用h0_part不好說,因爲都是0,在k=1的情況下,

h1_part  =  (1/8)* exp(2*pi/8*1*0) * (x23*f0 + x15*f8 + x7*f16)
   +(1/8)* exp(2*pi/8*1*1) * (x22*f1 + x14*f9 + x6*f17)
   +(1/8)* exp(2*pi/8*1*2) * (x21*f2 + x13*f10 + x5*f18)
   +(1/8)* exp(2*pi/8*1*3) * (x20*f3 + x12*f11 + x4*f19)
   +(1/8)* exp(2*pi/8*1*4) * (x19*f4 + x11*f12 + x3*f20)
   +(1/8)* exp(2*pi/8*1*5) * (x18*f5 + x10*f13 + x2*f21)
   +(1/8)* exp(2*pi/8*1*6) * (x17*f6 + x9*f14 + x1*f22)
   +(1/8)* exp(2*pi/8*1*7) * (x16*f7 + x8*f15 + x0*f23) 

  = (1/8)[ exp(2*pi/8*1*0) * (x23*f0) + exp(2*pi/8*1*(0+8)) * (x15*f8) +   exp(2*pi/8*1*(0+16))* x7*f16)
           exp(2*pi/8*1*1) * (x22*f1) + exp(2*pi/8*1*(1+8)) * (x14*f9) +   exp(2*pi/8*1*(1+16))* x6*f17)
           exp(2*pi/8*1*2) * (x21*f2) + exp(2*pi/8*1*(2+8)) * (x13*f10) +  exp(2*pi/8*1*(2+16)*x5*f18)
 +..

再把調製係數直接乘到濾波器係數上去(乘法結合律).

= (1/8)[ (x23)*exp(2*pi/8*1*0) *(f0) + (x15)*exp(2*pi/8*1*(0+8)) *( f8) +  (x7)*exp(2*pi/8*1*(0+16))*(f16)
           (x22)*exp(2*pi/8*1*1) * (f1) + (x14)*exp(2*pi/8*1*(1+8)) *(f9) +   (x6)*exp(2*pi/8*1*(1+16))*(f17)
          (x21)*exp(2*pi/8*1*2) * f2) + (x13)*exp(2*pi/8*1*(2+8)) *(f10) +  (x5)*exp(2*pi/8*1*(2+16)*(f18)
 +..

是不是和一個調製濾波器相卷積?

終於明白爲什麼要多相了吧,多相組內具有同樣的延遲!(歸根結底是應爲 WNk的週期性!!!)

真正的每個channel還是要做fft才能構成

上面的H0(z)H1(z) 不是所謂的H0(Z)的各個調製,它是H0(z)的各個多相分解濾波器

下面這個圖示真正的H0(z)

 

 

關於

圖出自https://www.iasj.net/iasj?func=fulltext&aId=97950

裏面Synthesis濾波器和analysis濾波的區別就是(對應濾波器) 一個序列是另一個序列的逆序,這樣做的目的是什麼?

明白了吧,在調整相位

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章