请给我一个利用窗函数的带通滤波器的MATLAB函数,要求高频低频的截至频率作为入口参数输入,待滤波的信号也是入口参数,返回值是滤波后的信号
时间: 2023-12-10 17:37:34 浏览: 105
下面是一个利用窗函数实现带通滤波的MATLAB函数:
```matlab
function [filtered_signal] = windowed_bandpass_filter(signal, fs, f_low, f_high, window_type)
% signal: 待滤波的信号
% fs: 采样频率
% f_low: 低频截止频率
% f_high: 高频截止频率
% window_type: 窗函数类型,可选参数有: 'rectangular', 'hamming', 'hanning', 'blackman'
% 计算滤波器的长度
N = 4 * fs / (f_high - f_low);
% 如果滤波器长度为奇数,则加一位变为偶数
if mod(N, 2) == 1
N = N + 1;
end
% 生成滤波器的时间序列
n = 0:N-1;
t = n / fs;
% 生成理想的带通滤波器
ideal_filter = (2 * (f_high - f_low) / fs) * sinc(2 * (f_high - f_low) * (t - (N-1)/2) / fs);
% 生成窗函数
if strcmpi(window_type, 'rectangular')
window = rectwin(N)';
elseif strcmpi(window_type, 'hamming')
window = hamming(N)';
elseif strcmpi(window_type, 'hanning')
window = hann(N)';
elseif strcmpi(window_type, 'blackman')
window = blackman(N)';
else
error('Invalid window type.');
end
% 将理想滤波器乘以窗函数得到实际滤波器
filter = ideal_filter .* window;
% 对信号进行滤波
filtered_signal = conv(signal, filter, 'same');
end
```
函数中使用了sinc函数来生成理想的带通滤波器,然后乘以窗函数得到实际的滤波器。窗函数可以选择矩形窗、汉明窗、汉宁窗或者布莱克曼窗,具体选哪个窗口取决于实际应用中的需求。
该函数返回滤波后的信号。使用方法如下:
```matlab
% 生成一个正弦波信号
fs = 1000; % 采样频率
t = 0:1/fs:1; % 时间序列
f1 = 50; % 低频
f2 = 150; % 高频
signal = sin(2*pi*f1*t) + sin(2*pi*f2*t); % 正弦波信号
% 对信号进行带通滤波
f_low = 80; % 低频截止频率
f_high = 120; % 高频截止频率
window_type = 'hamming'; % 窗函数类型
filtered_signal = windowed_bandpass_filter(signal, fs, f_low, f_high, window_type);
% 绘制原始信号和滤波后的信号
figure;
subplot(2,1,1);
plot(t, signal);
xlabel('Time (s)');
ylabel('Amplitude');
title('Original Signal');
subplot(2,1,2);
plot(t, filtered_signal);
xlabel('Time (s)');
ylabel('Amplitude');
title('Filtered Signal');
```
使用该函数可以方便地对信号进行带通滤波,得到滤波后的信号。
阅读全文