深入浅出解释FFT(四) |
您所在的位置:网站首页 › 相位特性怎么求 › 深入浅出解释FFT(四) |
很基础的问题往往很重要,做仿真时候有一个点的差错都会导致结果的错误。在网上找了前人写的东东,总结下希望对大家有帮助,让大家少走一些弯路。
1. 信号的时域采样点N和频域采样点数相同 %################################################################## clear all; close all; Adc =1.25; %直流分量幅度 A1 =1; %频率F1信号的幅度 A2 =0.25; %频率F2信号的幅度 F1 =100; %信号1频率(Hz) F2 =1000; %信号2频率(Hz) Fs =5120; %采样频率(Hz) Ts =1/Fs; %时域采样间隔,采样周期 P1 =-30; %信号1相位(度) P2 =90; %信号2相位(度) N =256; %采样点数,请注意时域采样N点,FFT时也是N点! t = [0 : 1/Fs : N/Fs]; %采样时刻,注意不是序列是真正的时间!t = [0:N]*Ts % t = [0 : N]//Fs; %共采样257个点,为了好看起见多采样了最后一个点,最后一个点在实际中应该是下一个采样周期的第一个点 %生成信号 %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); % 周期T1 = 2*pi/(2*pi*F1) = 0.01s,采样周期Ts = 0.00019531 < (T1)/2 signal2=A2*sin(2*pi*F2*t); % 周期T2 = 2*pi/(2*pi*F2) = 0.001s,采样周期Ts = 0.00019531 < (T2)/2 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; S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);%考虑相位 %显示原始信号 plot(S); title('原始信号'); figure; Y = fft(S,N); %做FFT变换 Ayy = (abs(Y)); %取模 plot(Ayy(1:N)); %显示原始的FFT模值结果 title('FFT 模值'); F = ([1:N] - 1) * Fs /N; %换算成实际的频率值, N*Fs/2 对应着w = pi % 因为MATLAB中FFT的变换矩阵不是一个酉矩阵(Unitary Matrix),该阵除以1/sqrt(N)就是个酉矩阵。故经过变换后对信号有放大作用, % 所以要在fft处理后结果除以N/2来,修正此“放大”作用。但是结果在直流的那一点是错误的,实际上直流应该除以N修正。 Ytemp = 2/N * fft(S,N); % 做FFT变换后除以N/2修正 figure; plot(F, abs(Ytemp));title('实际幅度-频率曲线图 --- abs前修正'); figure; Ayy = Ayy / (N /2); %换算成实际的幅度 Ayy(1) = Ayy(1) /2; %能看出来为什么直流信号除以N了吗?我开始没看出来啊 %假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应 %该频率下的信号的幅度(对于直流信号是除以N)
根据公式验证 --- 某点n所表示的频率为: Fn=(n-1)*Fs/N,因为没有fftshift 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 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |