|
本帖最后由 wdhd 于 2016-6-3 11:06 编辑
原帖由 hnyanhua 于 2008-6-12 14:55 发表
我对上面的程序进行了改进,使分辨率提高fs/B倍,分辨率的选择是任意的吗?
显示图形有问题呀?
x2=ifft(X2,fs/B*N);t1=linspace(0,1,fs/B*N)
figure(6)
stem(t1,x2),grid%画出滤波后的波形
title('滤波后的信号 ...
楼主用了50倍的比例,但似乎有些错误。时间的设置:
t1=linspace(0,1,fs/B*N)
这样得dt1=B/(fs*N),fs1=(fs*N)/B,即使经过B倍的下采样,比原来的fs还大。
我感觉楼主还没有完全了解ZFFT怎么去做,我在36层上提出x2应该是20481点(指20倍--36层上说是20500点,有误),这20481点不是靠补零得到的,应该是x本身就有20481点。下面我按这思路对程序作了较大的修改,及figure8的图。把该图与36层的图比较,可看到没有漪波,峰值明显,把2个个靠近的峰值分离了。
clear all; clc; close all;
N=input('取时间分隔的点数N=');%N的取值需满足采样定律
t=linspace(0,1,N);dt=1/N-1;fs=N-1;%取信号长度Tp=1s,给出采样周期Ts=dt,采样频率fs=1/Ts=N-1
N1=20*(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,x);grid%画出原始信号
title('原始信号x(t)')
xlabel('t(s)');ylabel('x(t)');
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)|');
f0=input('需求的中心频谱f0=');
x1=x.*exp(-j*2*pi*t1*f0);%'.*'为元素群运算
figure(3)
stem(t1,x1);grid
title('频移后的信号x1(t)')
xlabel('t(s)');ylabel('x1(t)');
X1=fft(x1,N);
figure(4)
plot(f,abs(X1)/max(abs(X1))),grid
xlabel('f(HZ)');ylabel('|X1(jf1)|');
%axis([f0 fs 0 1]) %坐标选择有点问题,我想是显示【f0 fs】,但是显示图形不正确。不知道是什么原因。
XX1=fft(x1);
ff=(0:N1-1)*fs/N1;
B=input('理想低通滤波器的带宽B=');
n=find(ff<B/2);%求出底通滤波器带宽内的下标
f1=f(n);%取出中段频率
X2=XX1(n);%取出中段频谱
x2=ifft(X2,N1);
y=resample(x2,1,20);% 对信号进行A倍的抽取
t2=resample(t1,1,20);
fs1=fs/20;
f3=(0:N-1)*fs1/N+250;
Y=fft(y,N);% 对信号进行抽取后的 FFT 运算
figure(8)
plot(f3,abs(Y)/max(abs(Y))),grid
xlabel('f(HZ)');ylabel('|Y(jf1)|');
set(gca, 'XTickMode', 'manual', 'XTick', [250, 256, 258, 260, 270, 280, 300]);
%输入参数分别为 1025 250 20.48 |
-
|