사인파의 FFT 결과를 확인하는 방법은 무엇입니까?


9

FFT 알고리즘의 입력으로 오디오 파일 (사인파) 1000Hz를 받았습니다. 어레이에 8192 개의 전력 스펙트럼 샘플이 있습니다.

내 출력이 올바른지 확인하는 가장 쉽고 쉬운 방법은 무엇입니까?

자동 오디오 파일을 제공하면 모든 샘플의 출력이 0입니다. 사인파에서 o / p는 20 (0 번째 샘플)에서 26059811 (743 번째 샘플)로 증가하고 점차 40으로 감소합니다.

출력 범위에 대한 아이디어를 얻으면 FFT가 작동하는지 기술적으로 증명할 수 있습니다.

어떤 아이디어라도 도움이 될 것입니다.

기술적 인 의문 사항 은 이 링크 를 참조하십시오 .


1
배열을 그릴 수 있습니까? (아마도 스프레드 시트 소프트웨어에서?)

배열에는 8192 개의 값이 있습니다. 수동으로 플롯하거나 스프레드 시트에서 처리하려고합니다 .MAC

2
MS Excel에서 수만 개의 샘플을 작성했습니다. 숫자 또는 다른 것도 적합합니다. 또는 gnuplot도 마찬가지입니다.

열린 사무실을 잊지 마십시오
가짜 이름

@ 가짜 이름 : 그래프를 그릴 수 없습니다.

답변:


4

8192 또는 8193 주파수 (0에서 Nyquist까지)의 제곱을 얻기 위해 10 개의 창 (겹치지 않습니까?)을 평균하여 스펙트럼을 계산하는 것처럼 보이지만 일부 알고리즘은 bin 8192에서 Nyquist 주파수를 떨어 뜨릴 수 있습니다.

가장 먼저 확인해야 할 것은 피크가 오른쪽 저장소에 있다는 것입니다. 샘플링 속도가 무엇인지 말하지 않았지만 빈 743은 샘플링 속도의 743/16384 배입니다. 신호가 실제로 800Hz이면 Fs는 약 17640 샘플 / 초입니다. 그건 잘못된 것 같습니다. 테스트 신호는 아마도 8000, 16000, 22050, 32000, 44100 또는 48000과 같은 표준 속도 일 것입니다. Fs = 22050의 경우 bin 800 / 22050 * 16384 = 594에서 피크가 급격히 증가합니다.

확인해야 할 또 다른 기준은 신호의 총 에너지가 시간 및 주파수 영역에서 거의 동일하다는 것입니다. 다음은 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

Fs = 22050 샘플 / 초로 샘플링 된 2 개의 정현파로 구성된 입력 신호 x는 NFFT = 2048 샘플 크기의 겹치지 않는 10 개의 창으로 분할됩니다. psd에 대한 호출 (전력 스펙트럼 밀도)은 16384 포인트 DFT 10 개의 제곱 크기의 평균으로 스펙트럼 y를 계산합니다 (실제로 x가 실제 값이므로 8193 포인트입니다).

psd 함수가 y를 전체 신호 길이 대신 DFT 크기로 스케일링했기 때문에 계산 된 주파수 영역 에너지의 스케일링 계수는 N / 16384입니다. 이것이 문제인지 여부는 시스템에서 PSD 정규화를 처리하는 방법에 따라 다릅니다. 다른 선택적인 정규화는 1 / F에 의한 스케일링입니다. 이것은 에너지를 원래의 아날로그 신호와 일치시킵니다. 기본 정규화는 라이브러리에 잘 문서화되어야합니다.


사인파 신호를 테스트했는데 1000Hz입니다. 내 FFT가 정답을 제공합니다. 도와 주셔서 감사합니다.

10

FFT 출력의 크기를 플로팅해야합니다. 프로그래밍 언어에 익숙하지 않지만 Python에서는과 같은 것을 사용합니다 plot(abs(fft(a))). 자동 입력의 경우 출력은 모두 0이어야합니다. 사인파 입력의 경우 두 개의 스파이크가 나타납니다.

대체 텍스트

실제 신호의 경우 스파이크가 왼쪽에서 오른쪽으로 대칭입니다. 실제 FFT를 수행하는 경우 (계산 효율이 높음) 플롯의 왼쪽 절반 만 중복 출력 이미지를 무시하므로 출력의 왼쪽 절반 만 얻습니다.

주파수가 높으면 스파이크가 중앙에 더 가깝습니다. 경우 주파수가 청크 크기와 동기화 완벽하다 , 스파이크는 하나의 점 넓은되며 다른 모든 정확히 0이 그렇지 않으면 위처럼 가늘게 "치마"를해야합니다 될 것입니다.


진폭으로 전력 스펙트럼 값을 의미합니까?

시간과 관련하여 t->?

시간에 대해 걱정하지 마십시오. FFT가 작동하는지 여부를 확인하는 경우 크기의 모양이 이와 비슷한 지 확인하기 만하면됩니다.
endolith

어쨌든 FFT가 제대로 작동하고 있는지 알 수 없습니다. 자유 시간에 그래프를 구현하려고 노력할 것입니다.

1
@clabacchio : 아. FFT는 플롯의 시작과 끝에서 f = 0 축으로 출력을 생성합니다. 플롯의 중간 점은 f = fs / 2 축입니다. 0 주파수가 중앙에 오도록 플롯을 재배 열하는 fftfreq 또는 fftshift 기능이 종종 있습니다. flic.kr/p/arVeZT
endolith

0

Excel Analysis Toolpak 내의 푸리에 분석 도구를 사용하여 데이터와 결과를 빠르게 확인했습니다.


MAC에서 일하고 있습니다.

@Warrior-그런 다음 MacPorts 또는 Fink를 사용하여 Gnumeric을 설치하십시오 ( 원하는 경우 Platypus 래퍼에 대한 정보는 이 페이지 를 참조하십시오 )
Kevin Vermeer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.