所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

怎样用FFT求信号的相位?

发布时间:2020-04-12 08:49:29

资讯分类:fft  相位  信号  相位  信号  周期
怎样用FFT求信号的相位?

抛砖引玉我试了一下,主要有两个注意点:1. fft时需要保证截取长度为整数个周期信号,这样不会有频谱泄露。(其实fft默认操作会将截取的信号周期延拓,因此截取整数个周期长度时经延拓还是原来的周期信号; 否则就需要考虑加窗影响了,即需要考虑叠加上窗函数的相位)2. 对于单频信号,频域只有一个频点处不为零,其余频点处均为零,而复数零相位是不确定的,这也是为什么angle(fft(x))会看到随机的相位序列; 但是在非零处相位应该是准确的。经测试在已知的频率点处的相位值正确,为2。——————————————————————————————————————————补充一个注意点: 单频信号采样一个周期至少需要采3个点。——————————————————————————————————————————再补充测试代码吧。我另加了个10Hz的信号clc; close all; clear;f0 = 50; f1 = 10;fs = 10*f0; % 10 points per periodts = 1/fs;T = 1; % T second length signal, T*f0 periods, T*f0 should be integerN = floor(T*fs); % total pointst = 0:ts:T-ts;x = cos(2*pi*f0*t + 2) + 0.6*cos(2*pi*f1*t + 1);X = fft(x)/N;f = (0:1/N:0.5)*fs;F0 = 1/T; figure;subplot(3,1,1); plot(t,x);subplot(3,1,2); plot(f, 2*abs(X(1:length(f))));subplot(3,1,3); plot(f, angle(X(1:length(f))));n = find(abs(X) > 0.01, 2);tar_f = (n-1)*F0;amp = abs(2*X(n)); % fold [fs/2, fs] to [0, fs/2]ang = angle(X(n));fprintf('frequecy: %fHz, %fHzn', tar_f(1), tar_f(2));fprintf('amplitude: %f, %fn', amp(1), amp(2));fprintf('angle: %f, %fn', ang(1), ang(2));结果如下:frequecy: 10.000000Hz, 50.000000Hzamplitude: 0.600000, 1.000000angle: 1.000000, 2.000000

留言与评论(共有 0 条评论)
   
验证码:
Top