|
我对程序进行了改进,如下,有一个小问题,低通滤波后频域图形显示有错,这是怎么回事?怎样改进啊?谢谢了。
clear all; clc; close all;
fs=input('采样频率fs=');%fs的取值需满足采样定律
f0=input('需求的中心频谱f0=');
B=input('理想低通滤波器的带宽B=');
N=fs+1;
t=linspace(0,1,N);dt=1/N-1;%取信号长度Tp=1s,给出采样周期Ts=dt,采样频率fs=1/Ts=N-1
N1=(fs/B)*(N-1)+1;
t1=(1:N1)/fs;
x=10*sin(2*pi*64*t1)+10*sin(2*pi*250*t1)+20*sin(2*pi*256*t1)+30*sin(2*pi*258*t1)+20*sin(2*pi*500*t1);
%信号最高频率fc=512HZ
figure(1)
stem(t1(1:1024),x(1:1024));grid%画出原始信号
title('原始信号x(t1)')
xlabel('t1(s)');ylabel('x(t1)');
f=linspace(0,N-1,N);
X=fft(x,N);
figure(2)
plot(f,abs(X)/max(abs(X))),grid
xlabel('f(HZ)');ylabel('|X(jf)|');
x1=x.*exp(-j*2*pi*t1*f0);%'.*'为元素群运算
figure(3)
stem(t1(1:1024),x1(1:1024));grid
title('频移后的信号x1(t1)')
xlabel('t1(s)');ylabel('x1(t1)');
X1=fft(x1,N);
f11=(0:N-1)*fs/N+f0;
figure(4)
plot(f11,abs(X1)/max(abs(X1))),grid
xlabel('f11(HZ)');ylabel('|X1(jf11)|');
set(gca, 'XTickMode', 'manual', 'XTick', [f0, 250, 400, 500, 524, 762, 1024]);
XX1=fft(x1);
ff=(0:N1-1)*fs/N1;%频域取样点数N1
n=find(ff<B/2);%求出底通滤波器带宽内的下标
f1=f(n);%取出中段正频率
X2=XX1(n);%取出中段正频谱
n1=find(f<B/2);%求出底通滤波器带宽内的下标
f111=f(n1);%取出中段正频率
X21=X1(n1);%取出中段正频谱
figure(6)
figure6.fig
(5.64 KB, 下载次数: 18)
plot(f111,abs(X21)/max(abs(X21))),grid
x2=ifft(X2,N1);
figure(7)
stem(t1(1:1024),x2(1:1024));grid
y=resample(x2,1,fs/B);% 对信号进行fs/B倍的抽取
t2=resample(t1,1,fs/B);
fs1=B;%采样频率下降fs/B倍
f3=(0:N-1)*fs1/N+f0;
Y=fft(y,N);% 对信号进行抽取后的 FFT 运算
figure(8)
plot(f3,abs(Y)/max(abs(Y))),grid
xlabel('f(HZ)');ylabel('|Y(jf)|');
set(gca, 'XTickMode', 'manual', 'XTick', [f0, 250, 256, 258, 260, 270, 280, 300]);
%输入参数分别为 1024 240 51.2 |
|