我必须在数字信号处理课程中做一些练习,但我遇到了一些问题。
我有一个给定的文件(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);
答案 0 :(得分:2)
您应该使用freqs
来计算模拟滤波器的频率响应/传递函数(即H(s)
)。所以在这种情况下,例如:
freqs(butter_b,butter_a,200);
将在200个频率点绘制滤波器的频率和相位响应。您还可以提供应该计算的点向量(请参阅链接的文档)。
对于数字滤波器的传递函数(即H(z)
),请使用freqz
。所以你的语法应该是这样的:
freqz(butter_b,butter_a,[],fs)
将再次绘制频率和相位响应,如前所述。同样,请务必阅读链接文档以正确理解和使用它。
答案 1 :(得分:0)
由于您知道信号中不需要的分量的频率,您只需要估计相位和幅度,然后在时域中减去信号中添加的噪声分量,以获得解决方案。
有许多方法可以估算正弦的相位和幅度。我建议你试试Goertzel算法。