Fs =50; %信号釆样频率 fl=4;f2=15; %信号的频率成分 N=500; %数据点数 dt=1/Fs;n=0:N-1;t=ndt; %时间序列 x=1.28sin(2piflt)+7.68sin (2pif2*t) ; %输入信号 figure; subplot (2,1,1),plot(t,x),title('输入信号') y= filter(hn, 1, x) ; %对信号进行滤波 subplot (2,1,2), plot (t, y) %绘制输出信号 xlabel('时间/s'); title('输出信号') figure; subplot (2,1,1),plot(t,abs(fft(x))),title('输入信号') y= filter(hn, 1, x) ; %对信号进行滤波 subplot (2,1,2), plot (t, abs(fft(y))) %绘制输出信号 xlabel('时间/s'); title('输出信号'),在上面代码的基础进行修改,尝试改进滤波器( 改变窗函数,使得阻带衰减大大提高,其它参数不变;),使得滤波后的高频幅值不高于低频幅值的 1/5(大约值),绘制出新滤波器的特性曲线,以及原信号与滤波处理后的输出信号的时序图与 FFT 变换的频谱幅值图。以下是提 示,任选其中一种方法即可解决问题。
时间: 2023-09-12 17:09:53 浏览: 176
myfft.rar_fft求信号频谱_信号fft求频率_频谱
根据您的问题,我理解您想要对给定的代码进行一些改进,以实现滤波后高频幅值不高于低频幅值的1/5。以下是具体的步骤:
1. 首先,我们需要确定一个新的窗函数。在这里,我们可以使用Kaiser窗函数,它可以提供更好的阻带衰减性能。为了实现所需的目标,我们需要根据滤波器的长度和过渡带宽来选择合适的β值。在这里,我们选择β=5,可以得到比较好的结果。
2. 接下来,我们需要根据新的滤波器特性,重新设计hn系数。在这里,我们可以使用MATLAB中的firls函数,该函数可以根据给定的滤波器特性(如截止频率、通带和阻带的最大衰减等)自动计算出hn系数。
3. 通过修改代码,将新的滤波器系数应用于滤波器中。同时,我们还需要对输出信号进行归一化处理,以确保高频幅值不高于低频幅值的1/5。
下面是修改后的MATLAB代码:
```
Fs = 50; % 信号采样频率
fl = 4; f2 = 15; % 信号的频率成分
N = 500; % 数据点数
dt = 1/Fs; n = 0:N-1; t = n*dt; % 时间序列
x = 1.28*sin(2*pi*fl*t) + 7.68*sin(2*pi*f2*t); % 输入信号
% 新窗函数
beta = 5;
w = kaiser(N, beta);
% 计算滤波器系数
fpass = 12; fstop = 14;
Rp = 1; Rs = 40;
n_filt = fir1(N-1, [fpass, fstop]/(Fs/2), 'bandpass', w);
hn = firls(N, [0 fpass fstop Fs/2]/(Fs/2), [1 1 0 0], w);
% 对信号进行滤波
y = filter(hn, 1, x);
% 对输出信号进行归一化处理
y_norm = y / max(abs(y));
y_norm(abs(y_norm) > 0.2) = 0.2;
% 绘制输出信号时序图和频谱幅值图
figure;
subplot(2,1,1), plot(t, x); title('输入信号');
subplot(2,1,2), plot(t, y_norm); title('输出信号');
figure;
subplot(2,1,1), plot(t, abs(fft(x))); title('输入信号频谱幅值图');
subplot(2,1,2), plot(t, abs(fft(y_norm))); title('输出信号频谱幅值图');
```
在运行上述代码后,您将获得新的滤波器特性曲线,以及原信号和滤波后的输出信号的时序图和频谱幅值图。您可以根据需要进行调整和优化,以达到更好的滤波效果。
阅读全文