Làm thế nào để kiểm tra kết quả FFT của sóng hình sin?


9

Tôi đã được cấp một tệp âm thanh (sóng hình sin) 1000Hz làm đầu vào cho thuật toán FFT của tôi. Tôi đã có 8192 mẫu phổ điện trong một mảng.

Cách tốt nhất và dễ nhất để kiểm tra xem đầu ra của tôi là đúng hay sai?

Nếu tôi cung cấp một tệp âm thanh im lặng thì đầu ra bằng không cho tất cả các mẫu. Trong một sin wav, o / p tăng từ 20 (mẫu thứ 0) lên 26059811 (mẫu thứ 743) và giảm dần xuống 40.

Nếu tôi có ý tưởng về phạm vi đầu ra thì tôi có thể chứng minh về mặt kỹ thuật xem FFT có hoạt động hay không.

Bất kỳ ý tưởng sẽ hữu ích.

Tham khảo liên kết này cho bất kỳ nghi ngờ kỹ thuật.


1
bạn có thể vẽ mảng của bạn? (có lẽ trong phần mềm bảng tính?)

Có 8192 giá trị trong mảng. Bạn muốn tôi vẽ đồ thị bằng tay hoặc bảng tính sẽ xử lý điều đó. Tôi đang làm việc trên MAC

2
Tôi đã vẽ hàng chục ngàn mẫu trong MS Excel; Gnumeric hoặc khác là phù hợp quá. Hoặc gnuplot quá.

Đừng quên mở văn phòng
Tên giả

Tên @Fake: tôi không thể vẽ đồ thị ..

Câu trả lời:


4

Có vẻ như bạn đang tính toán phổ bằng cách lấy trung bình 10 cửa sổ (không chồng lấp?) Để có độ lớn bình phương ở tần số 8192 hoặc 8193 (từ 0 đến Nyquist, nhưng một số thuật toán có thể giảm tần số Nyquist ở bin 8192).

Điều đầu tiên để kiểm tra là đỉnh nằm trong thùng bên phải. Bạn không nói tỷ lệ lấy mẫu là bao nhiêu, nhưng bin 743 sẽ gấp 743/16384 lần tốc độ lấy mẫu. Nếu tín hiệu thực sự ở mức 800 Hz, điều đó đặt F ở mức xấp xỉ 17640 mẫu / giây. Điều đó có vẻ sai. Tín hiệu kiểm tra của bạn có thể sẽ ở mức tiêu chuẩn, chẳng hạn như 8000, 16000, 22050, 32000, 44100 hoặc 48000. Đối với Fs = 22050, cực đại sẽ mạnh ở bin 800/25050 * 16384 = 594.

Một tiêu chí khác để kiểm tra là tổng năng lượng trong tín hiệu xấp xỉ như nhau ở cả hai miền thời gian và tần số. Đây là một ví dụ trong Python:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

Tín hiệu đầu vào x, bao gồm hai hình sin được lấy mẫu ở Fs = 22050 mẫu / giây, được phân thành 10 cửa sổ không chồng chéo có kích thước NFFT = 2048 mẫu. Lệnh gọi psd (mật độ phổ công suất) tính toán phổ y là trung bình của độ lớn bình phương của mười DFT 16384 điểm (thực tế là 8193 điểm vì x là giá trị thực).

Năng lượng miền tần số được tính toán có hệ số tỷ lệ là N / 16384 do hàm psd chia tỷ lệ y thành kích thước DFT thay vì tổng chiều dài tín hiệu. Đây có phải là vấn đề hay không phụ thuộc vào cách hệ thống của bạn xử lý bình thường hóa PSD. Một chuẩn hóa tùy chọn khác là chia tỷ lệ 1 / Fs. Điều này phù hợp với năng lượng với tín hiệu tương tự ban đầu. Các chuẩn hóa mặc định nên được ghi lại trong thư viện.


Tôi đã kiểm tra tín hiệu sóng hình sin của mình là 1000 Hz. Mine FFT cho câu trả lời đúng. Cảm ơn sự giúp đỡ của bạn.

10

Bạn cần vẽ đồ thị độ lớn của đầu ra của FFT. Tôi không quen thuộc với ngôn ngữ lập trình của bạn, nhưng trong Python bạn sẽ sử dụng một cái gì đó như plot(abs(fft(a))). Đối với đầu vào im lặng, đầu ra phải là tất cả các số không. Đối với đầu vào sóng hình sin, bạn sẽ thấy hai gai:

văn bản thay thế

Đối với một tín hiệu thực, các gai sẽ đối xứng từ trái sang phải. Tuy nhiên, nếu bạn đang thực hiện một FFT thực sự (hiệu quả hơn về mặt tính toán), bạn sẽ chỉ lấy nửa còn lại của âm mưu làm đầu ra của mình, vì nó bỏ qua hình ảnh phản chiếu dư thừa.

Nếu tần số cao hơn, các gai sẽ gần trung tâm hơn. Nếu tần số hoàn toàn đồng bộ với kích thước khối , thì cành sẽ chỉ rộng một điểm và mọi thứ khác sẽ chính xác bằng 0. Nếu không, nó sẽ có một "váy" thon như trên.


Bạn có nghĩa là giá trị phổ công suất như biên độ?

t -> có tham khảo thời gian không?

Đừng lo lắng về thời gian. Nếu bạn chỉ kiểm tra xem FFT có hoạt động hay không, tất cả những gì bạn cần làm là kiểm tra xem hình dạng của cường độ có giống như thế này không.
endolith

Dù sao thì tôi cũng không thể vẽ được FFT của mình. Tôi sẽ cố gắng thực hiện biểu đồ trong thời gian rảnh của tôi chắc chắn. Cảm ơn rất nhiều.

1
@clabacchio: Ồ. FFT tạo ra một đầu ra với trục f = 0 ở đầu và cuối của âm mưu. Điểm giữa của ô là trục f = fs / 2. Thường có một hàm fftfreq hoặc frafthift để sắp xếp lại âm mưu sao cho tần số 0 nằm ở trung tâm. flic.kr/p/arVeZT
endolith

0

Tôi đã sử dụng công cụ phân tích Fourier trong Công cụ phân tích Excel để kiểm tra nhanh dữ liệu và kết quả.


Tôi đang làm việc trên MAC.

@War Warrior - Sau đó, sử dụng MacPorts hoặc Fink để cài đặt Gnumeric (cũng xem trang này để biết một số thông tin về trình bao bọc Thú mỏ vịt nếu bạn muốn điều đó)
Kevin Vermeer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.