用matlab代码实现一系列脉冲信号经过窄带滤波器后的响应
时间: 2023-05-25 09:07:17 浏览: 71
清除命令窗口
clc;
%清除图形窗口
clf;
%生成脉冲信号
t = -1:0.001:1;
x = zeros(1,length(t));
x(t==0) = 1;
%生成窄带滤波器的频率响应
n = 21;
cutoff = 0.3;
h = zeros(1,n);
for i = 1:n
if i == ceil(n/2)
h(i) = 2*cutoff;
else
h(i) = sin(2*pi*cutoff*(i-ceil(n/2)))/(pi*(i-ceil(n/2)));
end
end
%将频率响应归一化
h = h/sum(h);
%计算脉冲信号经过滤波器后的响应
y = conv(x,h);
y = y(ceil(n/2):length(y)-(n-ceil(n/2)));
t2 = (t(1)+t(2))/2:(t(end-1)+t(end))/2;
%绘制原始信号和滤波后的信号
figure;
subplot(2,1,1);
plot(t,x);
xlabel('时间 (s)');
ylabel('幅度');
title('原始信号');
subplot(2,1,2);
plot(t2,y);
xlabel('时间 (s)');
ylabel('幅度');
title('滤波后的信号');
相关问题
用matlab代码实现一系列脉冲函数经过窄带滤波器后的时频响应
首先,需要定义一系列脉冲序列,并定义一个窄带滤波器的频率响应。
假设脉冲序列为:
```matlab
n = -50:50;
x = zeros(size(n));
x(n == 0) = 1;
```
定义窄带滤波器的频率响应为:
```matlab
fc = 10; % 滤波器中心频率
b = 1; % 滤波器带宽
fs = 100; % 采样频率
N = 101; % 滤波器阶数
h = zeros(N,1);
for i = 1:N
if (i-1-N/2)*fs/N >= fc-b/2 && (i-1-N/2)*fs/N <= fc+b/2
h(i) = 1;
end
end
```
接下来,需要对脉冲序列进行滤波,并绘制时频响应图。
```matlab
y = conv(x,h); % 进行滤波
t = -0.5:1/fs:0.5; % 时间轴
f = linspace(-fs/2,fs/2,length(y)); % 频率轴
Y = fftshift(abs(fft(y))); % 滤波后信号的频谱
subplot(2,1,1)
plot(t,x)
title('原始信号')
subplot(2,1,2)
plot(f,Y)
title('滤波后信号的频谱')
```
这里使用 `conv()` 函数对脉冲序列进行卷积滤波,然后绘制时域和频域波形。最后,使用 `fft()` 函数对滤波后的信号进行傅里叶变换,得到其时频响应图。
完整代码如下:
```matlab
n = -50:50;
x = zeros(size(n));
x(n == 0) = 1;
fc = 10; % 滤波器中心频率
b = 1; % 滤波器带宽
fs = 100; % 采样频率
N = 101; % 滤波器阶数
h = zeros(N,1);
for i = 1:N
if (i-1-N/2)*fs/N >= fc-b/2 && (i-1-N/2)*fs/N <= fc+b/2
h(i) = 1;
end
end
y = conv(x,h); % 进行滤波
t = -0.5:1/fs:0.5; % 时间轴
f = linspace(-fs/2,fs/2,length(y)); % 频率轴
Y = fftshift(abs(fft(y))); % 滤波后信号的频谱
subplot(2,1,1)
plot(t,x)
title('原始信号')
subplot(2,1,2)
plot(f,Y)
title('滤波后信号的频谱')
```
如何用matlab代码实现窄带滤波器被一系列脉冲激励后的响应
下面是一个实现窄带滤波器被一系列脉冲激励后的响应的 Matlab 代码示例:
```matlab
% 定义滤波器参数
fc = 1000; % 中心频率
bw = 500; % 带宽
fs = 8000; % 采样率
order = 6; % 阶数
% 计算滤波器系数
[b,a] = butter(order,(2/bw)*(fc/fs));
% 生成脉冲激励信号
t = 0:(1/fs):0.005; % 生成时域范围为 5ms 的采样时间点
x = [1,zeros(1,length(t)-1)]; % 生成一个单个脉冲
% 滤波器频率响应
f = 0:10:5000;
H = freqz(b,a,f,fs);
% 对每个脉冲进行滤波,并绘制响应结果
y = filter(b,a,x);
plot(t,y);
xlabel('时间 (s)');
ylabel('幅度');
title('滤波器响应');
% 绘制滤波器频率响应曲线
subplot(2,1,1)
plot(f,abs(H));
xlabel('频率 (Hz)');
ylabel('幅度响应');
title('滤波器频率响应');
subplot(2,1,2);
plot(f,angle(H));
xlabel('频率 (Hz)');
ylabel('相位响应');
title('滤波器相位响应');
```
这段代码首先定义了一个窄带滤波器的参数:中心频率 fc 和带宽 bw、采样率 fs 和阶数 order,然后使用 butter 函数计算出滤波器系数 b 和 a。接着,生成了一个单个脉冲 x 和采样时间点 t。然后,使用 filter 函数对每个脉冲进行滤波,并绘制响应结果。最后,使用 freqz 函数计算并绘制出滤波器的频率响应曲线。
运行以上 Matlab 代码即可实现窄带滤波器被一系列脉冲激励后的响应。
阅读全文