这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» FPGA» 基于MATLAB的FFT仿真

共1条 1/1 1 跳转至

基于MATLAB的FFT仿真

助工
2014-12-03 20:24:12 打赏

% $ Date: 10/11/2009 整理: eyes417 $
%##################################################################


%


% FILE : FFT.m


% TITLE: FFT计算仿真,得到频率和幅度值,相位图#此前在首页部分显示#


%


%##################################################################


close all;%先关闭所有图片
Adc = 1.25;%直流分量幅度
A1 = 1;%频率F1信号的幅度
A2 = 0.25;%频率F2信号的幅度
F1 = 100;%信号1频率(Hz)
F2 = 1000;%信号2频率(Hz)
Fs = 5120;%采样频率(Hz)
%P1 = -30;%信号1相位(度)
%P2 = 90;%信号相位(度)
N = 256;%采样点数
t = [0 : 1/Fs : N/Fs];%采样时刻


%生成信号
%S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);%考虑相位
signal1=A1*sin(2*pi*F1*t);
signal2=A2*sin(2*pi*F2*t);
S=A1*sin(2*pi*F1*t)+A2*sin(2*pi*F2*t);%无直流偏置
S=Adc+A1*sin(2*pi*F1*t)+A2*sin(2*pi*F2*t);%直流偏置
%S=Adc+[A1*sin(2*pi*F1*t)+A2*sin(2*pi*F2*t)]/2;

%显示原始信号
plot(S);
title('原始信号');


figure;
Y = fft(S,N);%做FFT变换
Ayy = (abs(Y));%取模
plot(Ayy(1:N));%显示原始的FFT模值结果
title('FFT 模值');


figure;
Ayy = Ayy / (N / 2);%换算成实际的幅度
Ayy(1) = Ayy(1) / 2;
F = ([1:N] - 1) * Fs / N;%换算成实际的频率值
plot(F(1:N/2), Ayy(1:N/2));%显示换算后的FFT模值结果
title('幅度-频率曲线图');


figure;
Pyy = [1 : N/2];
for i = 1 : N/2
Pyy(i) = phase(Y(i));%计算相位
Pyy(i) = Pyy(i) * 180 / pi;%换算为角度
end;
plot(F(1 : N/2), Pyy(1 : N/2));%显示相位图
title('相位-频率曲线图');




根据公式验证 --- 某点n所表示的频率为:Fn=(n-1)*Fs/N


f1=(6-1)*5120/256=100 (Hz) ---- 验证结果正确


f2=(51-1)*5120/256=1000(Hz)---- 验证结果正确



根据公式验证 --- 对于n=1点的信号,是直流分量,幅度即为A1/N ---A1=320/256=1.25 --- 验证结果正确


对于n点(n≠1,且n<=N/2)幅度A ---A=An/(N/2)=128/(256/2)=1 --- 验证结果正确




相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。


atan2(500, 148)=x,结果是弧度,换算为角度就是180*(-x)/pi=相位值。



根据FFT结果以及上面的分析计算,--- 频率,幅度.相位....我们就可以写出信号的表达式了,它就是我们开始提供的信号。------信号重建


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]