哪位好心人提供一个256点的FFT算法源程序给我呢?急用,拜托拜托!!! 25
2个回答
展开全部
function [PW,AW,f,Ph]=cftbyfft(wt,t,flag)
%cftbyfft.m
%连续函数的傅立叶变换
%本程序完成快速傅立叶变换,具体说明参看《精通matlab6.5》p174例题4.13.3.2-1的cftbyfft.m程序
%在原程序基础上增加了基二算法;增加了使“小”复数强制为0(参看《精通matlab6.5》p172
%例题4.13.2.3-3的fzzyfft.m程序<23>行
%本程序需要输入的参数为时间波形数据(wt,t)即测试结果向量wt,对应的时间坐标向量t;选择输入flag确定程序显示的图形
%注意:本程序计算的幅值谱很准确,但是相位谱非常不准,故输出数据建议取AW和f,相位Ph舍弃
if nargin==2;flag=0;end %采样频率为fs=N/T; flag=0,画出半功率范围图[0,fs/2],即为有效频率分析范围(采样定理)单边谱,幅值AW乘以2
%flag=1,画出对称频率范围的图[-fs/2,+fs/2],幅值AW为原始值
%flag=2,;画出整个频率范围的图[0,fs],幅值AW为原始值;
N=length(t); %
T=t(length(t))-t(1); %
dt=T/(N-1); %
NFFT=2^nextpow2(N); %基二算法
if N<NFFT;T=T*(NFFT-1)/(N-1);N=NFFT;end
W0=fft(wt,N); %该指令得到的W0经过反变换,即ifft(W0)可得到原时间波形
W=dt*W0; %
z_W=find(abs(W)<1.0e-10); %寻找有限字长运算产生的“小”复数
W(z_W)=zeros(length(z_W),1); %强制那些小复数恢复为0
df=1/T; %
n=0:1:(N-1);
%下面计算幅值谱和相位谱
if flag==0
n=0:(N/2-1);
W=2*W(1:N/2);
elseif flag==1
n=-N/2:(N/2-1);
W=fftshift(W);
else
n=0:(N-1);
end
f=n*df; %频率
AW=abs(W); %模的幅值
PW=W.*conj(W); %功率谱
Ph=angle(W); %相位(由于相位非常不准,建议不用)
if nargout==0 %调用cftbyfft函数时不要求输出数据
figure(2)
plot(f,AW);grid,xlabel('频率f');ylabel('幅值谱|w(f)|')
figure(3)
plot(f,Ph);grid,xlabel('频率f');ylabel('相位谱Ph')
figure(4)
plot(f,PW);grid,xlabel('频率f');ylabel('功率谱密度函数PDF')
end
Matlab编的
%cftbyfft.m
%连续函数的傅立叶变换
%本程序完成快速傅立叶变换,具体说明参看《精通matlab6.5》p174例题4.13.3.2-1的cftbyfft.m程序
%在原程序基础上增加了基二算法;增加了使“小”复数强制为0(参看《精通matlab6.5》p172
%例题4.13.2.3-3的fzzyfft.m程序<23>行
%本程序需要输入的参数为时间波形数据(wt,t)即测试结果向量wt,对应的时间坐标向量t;选择输入flag确定程序显示的图形
%注意:本程序计算的幅值谱很准确,但是相位谱非常不准,故输出数据建议取AW和f,相位Ph舍弃
if nargin==2;flag=0;end %采样频率为fs=N/T; flag=0,画出半功率范围图[0,fs/2],即为有效频率分析范围(采样定理)单边谱,幅值AW乘以2
%flag=1,画出对称频率范围的图[-fs/2,+fs/2],幅值AW为原始值
%flag=2,;画出整个频率范围的图[0,fs],幅值AW为原始值;
N=length(t); %
T=t(length(t))-t(1); %
dt=T/(N-1); %
NFFT=2^nextpow2(N); %基二算法
if N<NFFT;T=T*(NFFT-1)/(N-1);N=NFFT;end
W0=fft(wt,N); %该指令得到的W0经过反变换,即ifft(W0)可得到原时间波形
W=dt*W0; %
z_W=find(abs(W)<1.0e-10); %寻找有限字长运算产生的“小”复数
W(z_W)=zeros(length(z_W),1); %强制那些小复数恢复为0
df=1/T; %
n=0:1:(N-1);
%下面计算幅值谱和相位谱
if flag==0
n=0:(N/2-1);
W=2*W(1:N/2);
elseif flag==1
n=-N/2:(N/2-1);
W=fftshift(W);
else
n=0:(N-1);
end
f=n*df; %频率
AW=abs(W); %模的幅值
PW=W.*conj(W); %功率谱
Ph=angle(W); %相位(由于相位非常不准,建议不用)
if nargout==0 %调用cftbyfft函数时不要求输出数据
figure(2)
plot(f,AW);grid,xlabel('频率f');ylabel('幅值谱|w(f)|')
figure(3)
plot(f,Ph);grid,xlabel('频率f');ylabel('相位谱Ph')
figure(4)
plot(f,PW);grid,xlabel('频率f');ylabel('功率谱密度函数PDF')
end
Matlab编的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询