2011-09-20 63 views
1

我必須在數字信號處理課程中做一些練習,並且遇到一些問題。如何計算MATLAB中過濾器的傳遞函數?

我有一個給定的文件(signal.wav名稱信號x(n))添加了一些噪音,並且iIam要求從中找到一些信息。添加的噪音是η(n) = sin8000πn。所以我正在處理的信號是s(n) = x(n) + η(n)

爲了消除噪音,我使用了低通巴特沃思濾波器order = 2和截止頻率= 2000hz。

我想從過濾器和H(z)函數中找到傳遞函數H(s)。那麼我知道我必須應用雙線性轉換,但是iIont公司知道如何用MATLAB來完成。

任何人都可以幫我解決這個問題嗎?

這裏是我的代碼

[y, fs, nbits] = wavread('signal.wav'); 

% Playing the file 
disp('-> Playing at the original sample rate...'); 
sound(y, fs); 

fprintf('------------------------------------------\n'); 
% Sampling frequency 
fprintf('-> Sample frequency is:  %f.\n', fs); 

% Print the min and max values of the audio data. 
fprintf('-> The maximum data value is %f.\n', max(y)); 
fprintf('-> The minimum data value is %f.\n', min(y)); 
fprintf('------------------------------------------\n'); 

order = 2; 
sampling_freq = fs; 
cut_off_freq = 2000; 

[butter_a, butter_b] = butter(order,cut_off_freq/(sampling_freq/2)); 
%[butter_a, butter_b] = butter(order,cut_off_freq/(sampling_freq)); 

subplot(211), plot(y); 
subplot(212), plot(filter(butter_a,butter_b,y)); 

sound(filter(butter_a,butter_b,y),fs); 
+0

ITYM *傳遞函數*(不是「傳輸函數」)?在http://dsp.stackexchange.com上提出這個問題也許會更好,因爲它與編程相關的DSP相關性更高。 –

+0

對不起,我試圖從我的母語翻譯。我的意思是傳遞函數。 –

回答

2

您應該使用freqs來計算模擬濾波器的頻率響應/傳遞函數(即H(s))。因此,在這種情況下,如下所示:

freqs(butter_b,butter_a,200); 

將在200個頻率點處繪製濾波器的頻率和相位響應。您還可以提供應計算點的矢量(請參閱鏈接的文檔)。


對於數字濾波器的傳遞函數(即,H(z)),使用freqz。所以你的語法是這樣的:

freqz(butter_b,butter_a,[],fs) 

這將再次繪製頻率和相位響應如前所述。再次確保您閱讀鏈接文檔以正確理解和使用它。

+0

謝謝,這就是我需要的。我只更改了200到148864,因爲它是信號中的實際樣本數。現在我有另一個問題。該圖給我的頻率x 10^4,所以我看到在2 x 10^4 = 20000hz而不是2000hz截止。 –

+0

啊,我看到了什麼問題。代碼中'butter'的輸出應該被收集爲'[b,a]',即首先是分子係數。你扭轉了順序。翻轉,並嘗試這一點,你應該得到2K赫茲的截止頻率。 – abcd

0

既然你知道你只需要估計相位和幅度,然後從信號中減去所添加的噪聲分量在時域信號的不期望分量的頻率得到解決方案。

估計正弦的相位和振幅的方法很多。我建議你爲此嘗試Goertzel算法。

+0

正如我之前所說,我應用低通巴特沃思濾波器來消除噪音。練習如此說。 –