|
楼主 |
发表于 2007-11-22 11:24
|
显示全部楼层
根据bulefox的建议试了一下, 结果如图,
但是我发现一个问题,因为在我的test程序里面只引用了256个数据,所以再用zfft_m.m计算时,如果采用频率放大N杯,那么下采样之后的数据就变成原来数据长度的1/N了,所以在上图的第二部分中绿色曲线和蓝色并没有完全重合。
根据大家所说的,如果zfft之前的数据是256,那么zfft时数据的长度是256*放大倍数,所以我把程序改成下面这个样子:
x=aa(15001:156.25:55000); %数据长度256
fs=3200; %采样频率
N=256;
y1=fft(x,N);
n=0:N/2-1;
df=fs/N;
f=n*df;
y=abs(y1)/N*2;
y(1)=y(1)/2;
subplot(211)
plot(f,y(1:N/2));
title('fft()函数的响应 fs=3200');
xlabel('frequence/Hz')
ylabel('幅值')
grid on
axis([0,1600, 0,1])
hold on
%% zfft部分 小范围的细化
[a,b]=max(y(2:N/2));
fz=f(b+1); %细化的中心频率
np=8; % 放大倍数 细化倍数越大,幅值衰减越大
nfft=N; % FFT长度
fmin=fz-0.25* fs/np;% 最小细化截止频率
fmax=fmin+0.5*fs/np; % B=fs/np
% 最大细化截止频率 %保证中心频率在fz
% 计算zfft
x=aa(15001:156.25:335000); % 重新选取一段数据 数据长度是 256*8
x=x';
[a,o,r,g]=zfft_m(x,fmin,fs,nfft,np);
y2=zeros(1, nfft/2);
y2(1: nfft/4) =a(nfft-nfft/4+1 : nfft);
y2(nfft/4+1 : nfft/2) =a(1: nfft/4);
n=0: (nfft/2-1);%只取一半的fft结果,
% 定义细化后的频率向量 横坐标
f2=fmin+n*2*(fmax-fmin)/nfft;%从fmin起到fmax结束取了nfft/2个点,采样间隔是2点
%zfft的运算结果只是一段,而不是显示全部频率信号
%这一段是从fmin起到fmax结束的nfft个点
plot(f2, abs(y2),'g');
%% fft N*8 个数据
x=aa(15001:156.25:335000); %要进行变换的信号
fs=3200; %采样频率
N=N*np;
y1=fft(x,N); %x的长度是2048,N=2048
n=0:N/2-1;
df=fs/N;
f=n*df;
y=abs(y1)/length(x)*2;
y(1)=y(1)/2;
subplot(212)
plot(f,y(1:N/2));
title('fft()函数的响应 fs=3200');
xlabel('frequence/Hz')
ylabel('幅值')
grid on
axis([0,1600, 0,0.5])
hold on
plot(f2, abs(y2),'g');
如红字部分,重新给x赋一个长度为2048的数据,然后进行zfft,这个对我来说是必须的。
上面一段程序的结果如图:
这个说明了什么,说明zfft的结果是对的,是吗,
但是,为什么上半部分的图里面475Hz处的频率会有那种情况呢? |
|