回覆列表
  • 1 # 使用者2914314605510

    拋磚引玉我試了一下,主要有兩個注意點: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, %fHz\n", tar_f(1), tar_f(2));fprintf("amplitude: %f, %f\n", amp(1), amp(2));fprintf("angle: %f, %f\n", ang(1), ang(2));結果如下:frequecy: 10.000000Hz, 50.000000Hzamplitude: 0.600000, 1.000000angle: 1.000000, 2.000000

  • 中秋節和大豐收的關聯?
  • 華為筆記本f1到f12功能都是什麼?