사인파를 샘플링하고 주파수 구성 요소를 플로팅하려고하는데이를 구현하는 데 문제가 있습니다. 최대 진폭이 1이고 주파수가 100 인 사인파의 한 사이클에 대해 65536 개의 샘플을 채취 한 결과는 아래에서 볼 수 있습니다. 여기서 Y 축은 복소 푸리에 합의 크기이고 x 축은 샘플 번호입니다. .이 플롯에서 사인파의 주파수를 어떻게 알 수 있습니까?, 샘플 수 대 크기가 아닌 주파수 대 크기의 플롯을 원합니다.

진폭 1의 큰 스파이크 하나를 예상했습니다. 또는 진폭 0.5의 2 개의 스파이크가 각각 큰 진폭을 얻고있는 것 같습니다. 내가 뭘 잘못하고 있는지 모르겠습니다.

FFT of sin (2 * pi * f * t)

Matlab 코드 :

Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform); 

댓글

  • FFT 구현은 종종 $ N $ 또는 $ \ sqrt {N} $에 비례하여 이득을 얻습니다. 결과는 ' 불합리하지 않습니다.
  • 크기를 $ N $로 나누면 크기가 각각 약 0.425 인 두 개의 스파이크가 나타납니다 (예상 0.5보다 여전히 낮은 샘플 번호에서 x 축을 주파수로 변경하려면 어떻게해야합니까?

Answer

보기 두 샘플링 기간 dt 에서 계수가 $ 2 \ pi $ 이기 때문에 “헤르츠 단위로 주파수를 라디안 / 초 단위로 혼동합니다. em> 및 신호입니다. 내가 원하는 것이 무엇인지 명확히하기 위해 약간의 코드를 다시 작성했습니다.

Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)") 

샘플링 빈도가 65536 샘플 / 초인 경우 , 예를 들어 12KHz의 톤을 원하면 그림과 같이 만들 수 있습니다. 따라서 여기에서 샘플주기는 1/65536 초입니다.

각각 0.5의 진폭을 가진 두 개의 스파이크를 얻을 것으로 예상되는 것은 맞습니다-생성 된 톤이 아닙니다.

X 축을 Hertz로 조정하려면 벡터를 만드십시오. FFT 결과와 동일한 포인트 수 및 $-fs / 2 $ 에서 $ + fs까지 선형 증가 / 2 $ . 플롯에서 사용한 fftshift도 주목하십시오. 그것은 Matlab의 FFT 함수의 출력이 0에서 fs까지 선형 적으로 진행되기 때문입니다. DC를 중심으로 시각화하는 것이 더 쉽지만 어느 쪽이든 괜찮습니다. fftshift가 없으면 faxis 벡터는 0에서 fs 로 이동합니다.

12KHz 톤의 FFT

Answer

일부 FFT는 “자연적으로”크기를 나타 내기 위해 1 / N으로 나누어야합니다 (이는 비 에너지 보존 ). X 축에 레이블을 지정하려면 샘플 속도 (Fs)를 알아야합니다. 알려진 경우 f_x = bin_index * Fs / N, 최대 N / 2, 음의 주파수에 대해 미러링됩니다. 스펙트럼 피크 (입력 사인파)의 주파수가 FFT 길이에서 정확하게 정확히 주기적이지 않은 경우 (예 : 정수 사이클 수), 가장 가까운 FFT 결과 빈의 크기가 더 작아지고, 피크 크기에 더 가까운 추정치를 찾기 위해 빈 사이를 보간해야합니다 (포물선 또는 창 Sinc 커널 보간이 일반적 임).

답변

hotpaw2의 답에 som 공식을 추가하려면 :

FFT를 사용하여 신호 표현을 계산합니다.

$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$

여기서 $ k = 0,1, …, N / 2-1 $ 및 $ f_k = \ frac {kN} {N} f_s $의 경우 $ f_k = \ frac {k} {N} f_s $ $ k = N / 2, …, N-1 $의 경우 $ N $ 짝수로 가정합니다.

이제 FFT에서는 샘플링 단계 $ \ tau = 1 / f_s $를 사용하여 샘플을 가져와야합니다. , $ x_n = x (n \ tau) $ 및 샘플 배열 $ (x_n) _n $의 FFT는 스케일링 된 진폭 배열 $ (N \ hat x_k) _k $를 제공합니다. $ \ sum_ {k = 0} ^ {N-1} 1 = N $. 크기 조정 i 일반적으로 FFT 라이브러리 사용자가 처리 할 FFT 구현에서 제외됩니다.

답변

FFT는 메소드를 제공합니다. 이미 알고있는 DFT를 계산하는 것입니다. 이제 신호 x (n)과 DFT X (k)를 고려하십시오. 신호가 N (65536) 샘플로 구성된 경우 X (k)는 2*pi*k/N의 개별 주파수에서 값을 제공합니다. 실제로 위의 DFT X (k)는 X(2*pi*k/N). 따라서 X (1)을 찾는 경우 2 * pi * 1 / N의 이산 주파수에서 DFT 계수를 찾는다는 의미이고 유사하게, X (2)는 2 * pi * 2 / N에 대한 계수를 의미하므로 계속됩니다. 각 계수는 해당 신호에서 해당 주파수의 기여도를 보여줍니다. 이는 주파수가 신호의 주요 부분을 구성한다는 것을 의미합니다. 따라서 주파수와 관련하여 fft를 플로팅하려면 샘플 축을 2*pi*k/N 점이있는 주파수 축으로 교체합니다. 여기서 k = 0 ~ 65535.FT는 시간에 대한 정보를 제공하지 않습니다. 신호.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다