2013-06-26 76 views
0

我試圖在Matlab(2011a)中使用fvtool函數。在Matlab中顯示數字濾波器響應時輸入採樣率

這是一個由許多功能組成的交互式「工具」。我的代碼是這樣的:

%fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726)); 
b2 = fir1(40,0.5,kaiser(41,7.85726)); 
b3 = fir1(204,0.5,kaiser(205,10.0613)); 
fvtool(b1,1,b2,1,b3,1); 

這將產生: http://www.4shared.com/photo/sZunQTHJ/1_online.html

現在我去了「分析」 menue並選擇「採樣頻率」,然後輸入採樣頻率。爲每個過濾器。其結果是:

http://www.4shared.com/photo/sZunQTHJ/2_online.html

不是很好,因爲第二和第三濾波器的響應被重複。第一個濾波器的響應很好,從0到256/2 = 128 Hz。我希望第二個和第三個過濾器的響應速度達到64/2 = 32和32/2 = 16。分別。

於是,我就做手工,

%Digital filter: 
fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726)); b1(end+256)=0; 
b2 = fir1(40,0.5,kaiser(41,7.85726)); b2(end+448)=0; 
b3 = fir1(204,0.5,kaiser(205,10.0613)); b3(end+480)=0; 

%Filters Response 
n=1024; 
w = logspace(-1,2,n); 

digi_1 = freqz(b1,1,n,fs1); semilogx(w,20*log10(abs(digi_1)),'Color','k'); hold on 
digi_2 = freqz(b2,1,n,fs2); semilogx(w,20*log10(abs(digi_2)),'Color','b'); hold on 
digi_3 = freqz(b3,1,n,fs3); semilogx(w,20*log10(abs(digi_3)),'Color','r'); 
axis ([0.1 128 -140 10]) 

在這裏,我用freqz,並給它過濾分子和denomenator,加點的數n,加上採樣頻率。 FS。問題在於,如果沒有采樣頻率,Matlab似乎沒有做任何改變,即如果我沒有改變任何改變。

所以如果有人想幫忙,他/她可以幫我fvtools或我的手動代碼,這是一個比fvtools晚一步。

回答

1

好的,這實際上是朋友的解決方案,但爲了知識共享,我會在這裏發佈它。

基本上我的代碼存在的問題是我自己定義了x軸點(w = logspace(-1,2,n);),並且這與從freqz返回的y軸點不相容。而不是那樣,我應該簡單地使用從freqz返回的x軸點,因爲實際上freqz返回y和x aisx點。

因此,下面唯一的變化是從freqz中使用w而不是手動定義。

%Digital filter: 
fs1=256; fs2=64; fs3=32;             % Sampling frequencies. 
b1 = fir1(52,0.25,kaiser(53,7.85726));%32         % Defining filter 1 parameters 
b2 = fir1(40,0.5,kaiser(41,7.85726)); %16         % Defining filter 2 parameters 
b3 = fir1(204,0.5,kaiser(205,10.0613));%8         % Defining filter 3 parameters 

n=1024 

[h1,w1] = freqz(b1,1,n,fs1); fig1=semilogx(w1,20*log10(abs(h1)),'Color','k'); hold on 
[h2,w2] = freqz(b2,1,n,fs2); fig2=semilogx(w2,20*log10(abs(h2)),'Color','b'); hold on 
[h3 w3] = freqz(b3,1,n,fs3); fig3=semilogx(w3,20*log10(abs(h3)),'Color','r'); 

我不記得爲什麼我試圖手動定義w(x軸點),但就是這樣。

+0

爲了符合Matlab文檔語法,我應該寫[h1 f1]而不是[h1 w1]。這不是什麼大不了的事情,但是在引用文檔時可以消除混淆。看到這裏:http://www.mathworks.com/help/signal/ref/freqz.html – student1

1

看起來幾乎像fir1不喜歡你的選擇Wn爲第二個兩個過濾器。嘗試減少Wn

編輯 我希望這將是更清晰,遺憾的混亂,我原本以爲Wn按比例不同,對不起。

你是對的n,指定過濾器的長度,它的順序。濾波器順序越高可能會增加數值不穩定的可能性。在Mathworks公司文檔調出:

b = fir1(n,Wn,window) 

然後含有n階低通 FIR濾波器的第n + 1個係數

返回行矢量b。這是一個基於漢明窗的線性相位濾波器,具有歸一化的截止頻率Wn。輸出濾波器 係數b以z的遞減次冪排序。

Wn是一個介於0和1之間的數字,其中1對應奈奎斯特頻率。

所以,你是第一個過濾器:

% sampling frequency 256 Hz 
b1 = fir1(52,0.25,kaiser(53,7.85726)); 

作品好了!而接下來的兩個

% sampling frequency 64 Hz 
b2 = fir1(40,0.5,kaiser(41,7.85726)); 
% sampling frequency 32 Hz 
b3 = fir1(204,0.5,kaiser(205,10.0613)); 

顯示一個定期的響應,這將表明某種數值問題給我。創建這些過濾器/窗口時是否有任何警告? Mathworks文檔顯示Kaiser窗口的規格如下。

Kaiser Specification

其中alpha是在阻帶衰減的分貝。這個值可能過高嗎?試着放寬這個值,看看過濾器的行爲是否如你所期望的那樣。

+0

n只是一個分辨率,點數。它與實際的過濾事物無關。我改變它上下,沒有區別。請注意,因爲我將它們全部繪製在同一個圖上,所以3個過濾器的w(因此n)應該相同。 – student1

+0

更改Kaiser窗口的值並不會消除其他兩個過濾器的週期性。 請注意,其中一個去128赫茲(因爲我顯示,直到fs/2)這很好。其他人不斷重複。 這表明它可能不是過濾器本身的問題,相反,我認爲它是在響應函數中。 – student1

1

試試這個

hd1 = dfilt.dffir(b1); 
hd2 = dfilt.dffir(b2); 
hd3 = dfilt.dffir(b3); 

h = [hd1 hd2 hd3]; 
freqz(h); 

編輯1 其實,這可能會給你在原來的陳述同樣的問題,給我一分鐘... 更新確認;它確實如此。

EDIT 2
那麼試試這個來代替:

建立自己的過濾器飛秒放進去一拉:

fs1 = 256; 
fpass = .4*fs; 
fstop = .5*fs; 
band_limits = [fpass fstop]; 
band_type = [1 0]; % 0 = stop, 1 = pass 
ripple_dB = .1; % ripple mag 
stop_db = -60; % stopband attenuation 
dstop = 10^(stop_db/20); 
dpass = abs(1-10^(ripple_db/20/2)); 
dev = [dpass dstop]; % ripple spec 
c1 = kaiserord(band_limits,band_type,dev,fs1,'cell'); % kaiserwindow builder 
b1 = fir1(c{:}); % filter spec'd to window 

諸如此類,然後......做第一次代碼塊(h = [hd1 hd2 hd3]),當你打電話給freqz時,你可以正常化你的採樣頻率,並且所有的應該是按照您的預期顯示。

這可能是一個漫長的解決方案。在fvtoolfreqz中可能有一種方法,它允許您更改每個過濾器的參數,以將其「塑形」爲採樣窗口。

EDIT 3 在所有的現狀,默認的 「歸一化頻率」 視圖是足夠的。

如果fs1 = 256Hz,則每個採樣,2個π = 256個採樣。 π是128個樣本。您可以在輸入過濾器1的Fs後進入fvtool -> View -> Analysis Parameters ... -> [x] Normalized Frequency來查看。您可以看到截止點是如何指定的1/4 2 π。希望有所幫助。

+0

感謝您的迴應,但它不起作用。我重複了其他兩個過濾器的塊。首先問題是我正在使用特定的傳輸函數來實現我的FIR濾波器,您的方法使用窗口技​​術來實現,所以我得到了不同的響應。 – student1

+0

你肯定沒有看到過濾器的響應,我確信你看到由於採樣頻率不同而出現混疊。如果您在過濾器上單獨運行'fvtool'('fvtool(b1,1)'_etc_),併爲每個輸入單個頻率,您會明白我的意思。你的過濾器設計得很好,單獨顯示,但是'fvtool'會將它們全部繪製在同一個圖形上,作爲你最高採樣率(256Hz)的函數,這將取代其餘的。我仍在努力解決這個問題...... – endowdly

+0

說實話,我不確定如何解決這個問題。不過,我會評論說,只有看到你真的需要看到你的濾波器在任何採樣率下的響應都是fvtool默認的標準化頻率響應。歸一化的頻率響應[0 1] pi rads/sample等於[0 fs/2],這是您在第二幅圖中看到的濾波器1的響應。在您的歸一化頻率響應中,您的所有濾波器按照預期的採樣頻率執行。我不知道這是否有幫助。 – endowdly