濾波器之升餘弦


            一直很想深入學習濾波器方面的知識,圖書館也去借了書然後準備看,結果就是:然後就沒有然後了。DSP一直是自己的短板,因爲這裏面感覺小的技巧好多,而且都需要自己去琢磨,像濾波器這種東西,我腦海裏也只有少的可憐點印象。比如什麼FIR 和 IIR 之類的。理論尚且薄弱更不談實踐了,這也是制約自己進一步提高的重要方面。但是,現在的自己彷彿早已經沒了以前那麼耐心去啃書了,最多上網googling,再看點博文。所以,前今天看到導師改的msn簽名:靜心!覺得很有啓發,確實啊現在這個急功近利的社會,要做到的確有難度。說到這,又不得不再次表達對楊鴻文老師的敬佩,我覺得他應該是真正做到了那點,現在是很難再找到這樣熱愛自己工作的老師了,除了敬佩只剩瞻仰!

   貌似每次寫正文前,我都要嘮叨幾句。哎,嘮叨嘮叨也就過去了,人一輩子也不就這樣嘛。好了,言歸正傳,今天談談最常見的濾波器----升餘弦濾波器。先說說我們爲什麼這麼喜歡這個濾波器,最主要的原因就是它的拖尾衰減的比Nyquist濾波器(sinc())快,這樣的好處就是當我們出現了定時誤差的時候,碼間干擾儘可能降低了。另一方面,既然衰減快了,說明它的頻率成分肯定是增加了,這就導致帶寬的增加。所以,它是以帶寬換取低ISI的典型應用。接下來給出升餘弦濾波器時域和頻域表達式:

 

 

 

 

接下來我們就實踐下,我們從時域來產生濾波器,再驗證頻域圖像是否正確。

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Author	: ZXY
% Email		: [email protected]
% Version	: 1.0
% Date		: 2012-2-16
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
看代碼,直接點左上角view plain!

clear all
fs = 20;
%we define T = 1,so we ignore it!!
% defining the sinc filter
sincNum = sin(pi*[-fs:1/fs:fs]); % numerator of the sinc function
sincDen = (pi*[-fs:1/fs:fs]); % denominator of the sinc function
sincDenZero = find(abs(sincDen) < eps);%the eps is 2.2204e-016
sincOp = sincNum./sincDen;
sincOp(sincDenZero) = 1; % sin(pix/(pix) =1 for x =0 諾比達法則

alpha = 0;
cosNum = cos(alpha*pi*[-fs:1/fs:fs]);
cosDen = (1-(2*alpha*[-fs:1/fs:fs]).^2);
cosDenZero = find(abs(cosDen)<eps);
cosOp = cosNum./cosDen;
cosOp(cosDenZero) = pi/4;
gt_alpha0 = sincOp.*cosOp;
N = length(gt_alpha0);
GF_alpha0 = fft(gt_alpha0,N);

alpha = 0.5;
cosNum = cos(alpha*pi*[-fs:1/fs:fs]);
cosDen = (1-(2*alpha*[-fs:1/fs:fs]).^2);
cosDenZero = find(abs(cosDen)<eps);
cosOp = cosNum./cosDen;
cosOp(cosDenZero) = pi/4;%諾比達法則直接計算
gt_alpha5 = sincOp.*cosOp;
N = length(gt_alpha5);
GF_alpha5 = fft(gt_alpha5,N);

alpha = 1;
cosNum = cos(alpha*pi*[-fs:1/fs:fs]);
cosDen = (1-(2*alpha*[-fs:1/fs:fs]).^2);
cosDenZero = find(abs(cosDen)<eps);
cosOp = cosNum./cosDen;
cosOp(cosDenZero) = pi/4;
gt_alpha1 = sincOp.*cosOp;
N = length(gt_alpha5);
GF_alpha1 = fft(gt_alpha1,N);

close all
figure
plot([-fs:1/fs:fs],[gt_alpha0],'r','LineWidth',2)
hold on
plot([-fs:1/fs:fs],[gt_alpha5],'g','LineWidth',2)
plot([-fs:1/fs:fs],[gt_alpha1],'b','LineWidth',2)
legend('alpha=0','alpha=0.5','alpha=1');
grid on
xlabel('時間, t')
ylabel('幅度, g(t)')
title('時域圖像')

figure
%除以fs的原因是因爲採樣導致幅度加權了。
plot([-N/2:N/2-1]/N*fs, abs(fftshift(GF_alpha0))/fs,'r','LineWidth',2);
hold on
plot([-N/2:N/2-1]/N*fs, abs(fftshift(GF_alpha5))/fs,'g','LineWidth',2);

plot([-N/2:N/2-1]/N*fs, abs(fftshift(GF_alpha1))/fs,'b','LineWidth',2);
legend('alpha=0','alpha=0.5','alpha=1');
axis([-2 2 0 1.2])
grid on
xlabel('頻率, f')
ylabel('幅值, |G(f)|')
title('頻域圖像')

對於其中頻域計算在前面一篇文章中有說明,利用FFT 及 IFFT實現傅立葉正反變換

結果如圖所示:

 

好了,我們可以看出與理論分析是一致的,由於我們用的是很粗暴的矩形窗,所以你能明顯看見吉布斯現象。同樣,當拖尾衰減更快時,它的頻域也無情地展開了。這個仿真的難點還是寫出它的時域表達式,其他的都還好說。原來仿真很少加窗,現在可以用上自己的升餘弦了,不再去用自帶的函數,參數不好記啊那些。關鍵是對原理更清楚了。比如:我們數據發送出去之前,要成形濾波,這樣來抵抗ISI,那麼我們就用數據與這裏的濾波器(準確說是帶根號,整體效果還是一個升餘弦)做卷積運算。注意的是,這裏的數據也要相應的過採樣,關於採樣,等自己弄明白來說,好多東西自己還沒理解那麼透徹。完!



發佈了38 篇原創文章 · 獲贊 322 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章