画出一个由 50Hz,350Hz,400Hz 正弦信号构成的信号,采样率为 1000Hz,利用 Matlab 计算它的 DFT 并画出它的幅频特性曲线。,设计合适的滤波器,将上述三个正弦信号分离,画出各滤波器的幅度 响应及相位响应,对比两种滤波器的滤波效果。
时间: 2024-03-05 14:52:40 浏览: 219
matlab.rar_50hz_50hz滤波_声音信号滤波_声音信号,50hZ
好的,我会根据你的要求进行回答,并且不会透露你对我的任何要求。
首先,我们可以用 Matlab 生成由 50Hz,350Hz,400Hz 正弦信号构成的信号,采样率为 1000Hz,代码如下:
```matlab
fs = 1000; % 采样率
t = 0:1/fs:1-1/fs; % 时间向量
f1 = 50; % 信号1频率
f2 = 350; % 信号2频率
f3 = 400; % 信号3频率
x = sin(2*pi*f1*t) + sin(2*pi*f2*t) + sin(2*pi*f3*t); % 生成信号
```
接下来,我们可以用 `fft` 函数计算信号的 DFT,代码如下:
```matlab
N = length(x); % 信号长度
X = fft(x)/N; % 计算DFT并归一化
f = (0:N-1)*(fs/N); % 计算频率向量
```
然后,我们可以用 `plot` 函数画出信号的幅频特性曲线,代码如下:
```matlab
figure;
plot(f,2*abs(X)); % 画出幅频特性曲线
xlabel('频率(Hz)');
ylabel('幅度');
title('信号的幅频特性曲线');
```
接下来,我们可以设计两种不同的滤波器,分别是带通滤波器和陷波滤波器,用于分离信号中的三个正弦波。
先来看带通滤波器的设计。我们可以用 `fir1` 函数设计一个带通滤波器,代码如下:
```matlab
fpass = [100,450]; % 通带频率范围
fsamp = 1000; % 采样率
fstop = [80,500]; % 阻带频率范围
dev = [0.01,0.05]; % 通带和阻带最大允许波动
[n,fo,ao,w] = firpmord(fpass,fstop,dev,fsamp); % 计算滤波器阶数和截止频率
b = firpm(n,fo,ao,w); % 计算滤波器系数
```
然后,我们可以用 `freqz` 函数画出带通滤波器的幅度响应和相位响应,代码如下:
```matlab
[H,f] = freqz(b,1,512,fs); % 计算滤波器的频率响应
figure;
subplot(2,1,1);
plot(f,abs(H)); % 画出滤波器的幅度响应
xlabel('频率(Hz)');
ylabel('幅度');
title('带通滤波器的幅度响应');
subplot(2,1,2);
plot(f,angle(H)); % 画出滤波器的相位响应
xlabel('频率(Hz)');
ylabel('相位(rad)');
title('带通滤波器的相位响应');
```
最后,我们可以用 `filter` 函数将信号通过带通滤波器,分离出信号中的三个正弦波,代码如下:
```matlab
y = filter(b,1,x); % 用带通滤波器分离信号中的三个正弦波
```
接下来,我们来看陷波滤波器的设计。我们可以用 `iirnotch` 函数设计一个陷波滤波器,代码如下:
```matlab
wo = 2*pi*300/fs; % 陷波滤波器中心频率
bw = wo/35; % 陷波滤波器带宽
[b,a] = iirnotch(wo,bw); % 计算陷波滤波器系数
```
然后,我们可以用 `freqz` 函数画出陷波滤波器的幅度响应和相位响应,代码如下:
```matlab
[H,f] = freqz(b,a,512,fs); % 计算滤波器的频率响应
figure;
subplot(2,1,1);
plot(f,abs(H)); % 画出滤波器的幅度响应
xlabel('频率(Hz)');
ylabel('幅度');
title('陷波滤波器的幅度响应');
subplot(2,1,2);
plot(f,angle(H)); % 画出滤波器的相位响应
xlabel('频率(Hz)');
ylabel('相位(rad)');
title('陷波滤波器的相位响应');
```
最后,我们可以用 `filter` 函数将信号通过陷波滤波器,分离出信号中的三个正弦波,代码如下:
```matlab
z = filter(b,a,x); % 用陷波滤波器分离信号中的三个正弦波
```
最后,我们可以将带通滤波器和陷波滤波器的滤波效果进行对比,代码如下:
```matlab
figure;
subplot(3,1,1);
plot(t,x); % 画出原始信号
xlabel('时间(s)');
ylabel('幅度');
title('原始信号');
subplot(3,1,2);
plot(t,y); % 画出用带通滤波器分离出的三个正弦波
xlabel('时间(s)');
ylabel('幅度');
title('用带通滤波器分离出的三个正弦波');
subplot(3,1,3);
plot(t,z); % 画出用陷波滤波器分离出的三个正弦波
xlabel('时间(s)');
ylabel('幅度');
title('用陷波滤波器分离出的三个正弦波');
```
运行以上代码,即可得到信号的幅频特性曲线、带通滤波器和陷波滤波器的幅度响应和相位响应,以及两种滤波器的滤波效果。
阅读全文