前面寫過一篇文章,但是感覺對於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濾波的區別就是(對應濾波器) 一個序列是另一個序列的逆序,這樣做的目的是什麼?
明白了吧,在調整相位