Giả sử bạn sử dụng biến đổi Fourier rời rạc để xem xét tần số, thì bạn phải cẩn thận về cách diễn giải tần số chuẩn hóa thành tần số chuẩn (ví dụ: Hz).
Theo FFTW tutorial về cách tính toán phổ năng lượng của một tín hiệu:
#include <rfftw.h>
...
{
fftw_real in[N], out[N], power_spectrum[N/2+1];
rfftw_plan p;
int k;
...
p = rfftw_create_plan(N, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
...
rfftw_one(p, in, out);
power_spectrum[0] = out[0]*out[0]; /* DC component */
for (k = 1; k < (N+1)/2; ++k) /* (k < N/2 rounded up) */
power_spectrum[k] = out[k]*out[k] + out[N-k]*out[N-k];
if (N % 2 == 0) /* N is even */
power_spectrum[N/2] = out[N/2]*out[N/2]; /* Nyquist freq. */
...
rfftw_destroy_plan(p);
}
Lưu ý nó xử lý độ dài dữ liệu mà không phải là chẵn. Lưu ý đặc biệt nếu chiều dài dữ liệu được đưa ra, FFTW sẽ cung cấp cho bạn một "thùng" tương ứng với tần số Nyquist (tỷ lệ mẫu chia cho 2). Nếu không, bạn không nhận được nó (tức là thùng cuối cùng nằm ngay dưới Nyquist).
Một MATLAB example là tương tự, nhưng họ đang lựa chọn chiều dài của 1000 (một số chẵn) ví dụ:
N = length(x);
xdft = fft(x);
xdft = xdft(1:N/2+1);
psdx = (1/(Fs*N)).*abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:Fs/length(x):Fs/2;
Nói chung, nó có thể được thực hiện (của DFT) phụ thuộc. Bạn nên tạo một sóng sin tinh khiết thử nghiệm ở tần số đã biết và sau đó đảm bảo tính toán cho cùng một số.
FFT sẽ cung cấp cho bạn tần suất các thành phần hình sin của tín hiệu của bạn. Nếu bạn muốn đo tần số của tín hiệu thực (bất kỳ hình dạng nào) hơn bạn phải quên FFT và sử dụng quét mẫu để không vượt qua, hoặc tìm kiếm đỉnh cao nhất vv ... phụ thuộc khá nhiều vào hình dạng và bù đắp tín hiệu của bạn. btw trên FFT bạn có 2 peeks một là gương của người đầu tiên nếu tín hiệu đầu vào là trên tên miền thực) vì vậy bỏ qua nửa thứ hai của FFT – Spektre