matlab fft zoom,求教高手怎么实现ZoomFFT?

function [f2,y2,fi,fa]=zoomfft(x, fs, fi, d, nfft, handles)

% Input

% x : 被测信号

% fs : 采样频率

% fi : 细化的最低频率

% d : 放大倍数(细化倍数)

% nfft : 作细化FFT长

%

%%

%计算输入数据长度

nt=length(x);

%最大细化截止频率

fa=fi+0.5*fs/d;

%取大于nt且与nt最接近的2的整数次方为FFT长度

nf=2^nextpow2(nt);

%确定细化带宽的数据长度

na=round(0.5*nf/d+1);

% 1.频移

%建立一个按1递增的向量

n=0:nt-1;

%建立单位旋转因子进行频移

b=n*pi*(fi+fa)/fs;

%乘以单位旋转引自进行频移

y=x.*exp(-i*b);

% 2.频移后的低通滤波(频域滤波)

%FFT变换

b=fft(y,nf);

%正频率带桶内的元素赋值

a(1:na)=b(1:na);

%负频率带通内的元素赋值

a(nf-na+1:nf)=b(nf-na+1:nf);

%FFT变换

b=ifft(a,nf);

% 3.重采样

c=b(1:d:nt);

% 4.进行细化FFT变换

a=fft(c,nfft)*2/nfft;

% 5.变换结果重新排序

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=fi+n*2*(fa-fi)/nfft;

%%

%对输入数据作FFT用来变化比较

%FFT变换

y1=fft(x,nfft)*2/nfft;

f1=n*fs/nfft;

%定义与细化FFT频率向量相同的频率范围

ni=round(fi*nfft/fs+1);

na=round(fa*nfft/fs+1);

%绘制输入时程曲线图形

%%

% figure

% subplot(2,1,1);

% t=0:1/sf:(nt-1)/sf;

% % nn=1:3000;

% plot(t,x);

% xlabel('时间(s)');

% ylabel('幅值');

% grid on

%在相同的频率范围下绘制幅频曲线图

% subplot(212);

nn=ni:na;

axes(handles.axes_fft)

plot(f1(nn),abs(y1(nn)),':b',f2,abs(y2),'r');

title('信号频域图')

xlabel('频率(Hz)');

ylabel('幅值');

legend('普通','细化');

grid on

%打开文件输出细化后的数据

% fid=fopen(fno,'w');

% for k=1:nfft/2

%     %每行输出3个实行数据,f为频率,y2的实和虚部

%     fprintf(fid,'%f %f %f\n',f2(k),real(y2(k)),imag(y2(k)));

% end

% status=fclose(fid);

我想问一下,设计滤波器那一段根据的是什么原理啊?设计出来的是什么样的滤波器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值