如何在MATLAB中计算滤波器的传递函数?

时间:2011-09-20 13:19:31

标签: matlab signal-processing

我必须在数字信号处理课程中做一些练习,但我遇到了一些问题。

我有一个给定的文件(signal.wav名称信号x(n)),添加了一些噪音,iIam要求从中查找一些信息。添加的噪音为η(n) = sin8000πn。所以我正在处理的信号是s(n) = x(n) + η(n)

为了消除噪音,我应用了order = 2和截止频率= 2000hz的低通butterworth滤波器。

我想从过滤器和H(s)函数中找到传递函数H(z)。我知道我必须应用双线性变换,但我不知道如何使用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);

2 个答案:

答案 0 :(得分:2)

您应该使用freqs来计算模拟滤波器的频率响应/传递函数(即H(s))。所以在这种情况下,例如:

freqs(butter_b,butter_a,200);

将在200个频率点绘制滤波器的频率和相位响应。您还可以提供应该计算的点向量(请参阅链接的文档)。


对于数字滤波器的传递函数(即H(z)),请使用freqz。所以你的语法应该是这样的:

freqz(butter_b,butter_a,[],fs)

将再次绘制频率和相位响应,如前所述。同样,请务必阅读链接文档以正确理解和使用它。

答案 1 :(得分:0)

由于您知道信号中不需要的分量的频率,您只需要估计相位和幅度,然后在时域中减去信号中添加的噪声分量,以获得解决方案。

有许多方法可以估算正弦的相位和幅度。我建议你试试Goertzel算法。