2009-03-02 3 views
95

파이썬으로 그래픽 스펙트럼 분석기를 만들려고합니다.Fast Fourier Transform을 사용하여 오디오 분석

현재 1024 비트의 16 비트 이중 채널 44,100 Hz 샘플 속도 오디오 스트림을 읽고 두 채널의 진폭을 평균합니다. 이제 256 개의 서명 된 반바지가 있습니다. 이제 numpy와 같은 모듈을 사용하여 해당 배열에서 fft를 실행하고 결과를 사용하여 그래픽 스펙트럼 분석기를 만들고 싶습니다. 시작하려면 32 개의 막대가됩니다.

나는 Fast Fourier Transform과 Discrete Fourier Transform에 대한 위키 피 디아 기사를 읽었으나 결과 배열이 무엇을 나타내는지는 아직 분명하지 않다.

[ -3.37260500e+05 +0.00000000e+00j 7.11787022e+05 +1.70667403e+04j 
    4.10040193e+05 +3.28653370e+05j 9.90933073e+04 +1.60555003e+05j 
    2.28787050e+05 +3.24141951e+05j 2.09781047e+04 +2.31063376e+05j 
    -2.15941453e+05 +1.63773851e+05j -7.07833051e+04 +1.52467334e+05j 
    -1.37440802e+05 +6.28107674e+04j -7.07536614e+03 +5.55634993e+03j 
    -4.31009964e+04 -1.74891657e+05j 1.39384348e+05 +1.95956947e+04j 
    1.73613033e+05 +1.16883207e+05j 1.15610357e+05 -2.62619884e+04j 
    -2.05469722e+05 +1.71343186e+05j -1.56779748e+04 +1.51258101e+05j 
    -2.08639913e+05 +6.07372799e+04j -2.90623668e+05 -2.79550838e+05j 
    -1.68112214e+05 +4.47877871e+04j -1.21289916e+03 +1.18397979e+05j 
    -1.55779104e+05 +5.06852464e+04j 1.95309737e+05 +1.93876325e+04j 
    -2.80400414e+05 +6.90079265e+04j 1.25892113e+04 -1.39293422e+05j 
    3.10709174e+04 -1.35248953e+05j 1.31003438e+05 +1.90799303e+05j... 

내가 바로이 숫자가 무엇을 나타내는 지 궁금와 나는 각각에 대한 높이의 비율로이 숫자로 변환 할 방법이 배열 내가 NumPy와 사용하여 내 배열에 FFT를 미리 형성 한 후 모습입니다 32 바. 또한 평균 2 채널을 사용해야합니까?

답변

187

표시 할 배열은 오디오 신호의 푸리에 변환 계수입니다. 이 계수는 오디오의 주파수 내용을 가져 오는 데 사용할 수 있습니다. FFT는 복소수 값 입력 함수에 대해 정의되므로 입력 값이 모두 실제 값이더라도 나가는 계수는 허수가됩니다. 각 주파수의 전력량을 얻으려면 각 주파수에 대한 FFT 계수의 크기를 계산해야합니다. 이것은 이 아니며 계수의 실수 성분이입니다. 실수 및 허수 성분의 제곱의 합을 제곱근으로 계산해야합니다. 즉, 계수가 a + b * j이면 그 크기는 sqrt (a^2 + b^2)입니다.

각 FFT 계수의 크기를 계산하면 각 FFT 계수가 속하는 오디오 주파수를 알아야합니다. N 포인트 FFT는 0부터 시작하여 N 개의 등 간격 주파수에서 신호의 주파수 내용을 제공합니다. 샘플링 주파수가 44100 샘플/초이기 때문입니다. FFT의 포인트 수는 256이고 주파수 간격은 44100/256 = 172 Hz (약)

배열의 첫 번째 계수는 0의 주파수 계수입니다. 기본적으로 모든 주파수의 평균 전력 레벨입니다. 나머지 계수는 172Hz의 배수로 0에서부터 128까지 카운트됩니다. FFT에서는 샘플 포인트의 절반까지만 주파수를 측정 할 수 있습니다. 왜 처벌에 대한 열망이 있고 그 이유를 알아야하지만 기본 결과는 낮은 빈도가 복제 될 것이라거나 고 빈도 버킷에 aliased 인 경우 Nyquist FrequencyNyquist-Shannon Sampling Theorem에있는 링크를 읽으십시오.따라서 주파수는 0부터 시작하여 N/2 계수까지 각 계수에 대해 172 Hz만큼 증가한 다음 N-1 계수까지 172 Hz만큼 감소합니다.

시작하기에 충분한 정보 여야합니다. 위키 백과에서 제공하는 FFT보다 훨씬 더 친숙한 소개를 원하시면 Understanding Digital Signal Processing: 2nd Ed.을 시도해보십시오. 그것은 나를 위해 매우 도움이되었습니다.

그래서 그 숫자가 나타내는 것입니다. 각 주파수 성분 크기를 모든 성분 크기의 합으로 스케일링하여 높이 비율로 변환 할 수 있습니다. 그렇다고해서 각 주파수에 대한 실제 전력이 아닌 상대 주파수 분포를 나타낼뿐입니다. 주파수 구성 요소에 가능한 최대 크기로 스케일링을 시도 할 수는 있지만 잘 표시되지 않을지는 확실하지 않습니다. 실행 가능한 스케일링 요소를 찾는 가장 빠른 방법은 크고 부드러운 오디오 신호를 실험하여 올바른 설정을 찾는 것입니다.

마지막으로, 전체 오디오 신호의 주파수 내용을 전체적으로 표시하려면 두 채널의 평균을 구해야합니다. 스테레오 오디오를 모노 오디오로 믹싱하고 결합 된 주파수를 표시합니다. 오른쪽 및 왼쪽 주파수에 대해 두 개의 개별 디스플레이가 필요하면 각 채널에서 별도로 푸리에 변환을 수행해야합니다.

+3

+1이고 새로운 관용어를 배우게하려면 다음 사항을 유의하십시오. 나는 영어 원어민이 아니다.;) – macbirdie

+1

+1 굉장한, 내가 잘못한 것을 이해하는 데 도움이되었습니다. – Davido

+4

+1 - FFT에 대해 이미 알고 있지만 웹에서 가장 일반적인 영어 설명 중 하나입니다. – OldTinfoil

10

길이가 256/44100 = 0.00580499 초인 견본입니다. 즉, 주파수 해상도는 1/0.00580499 = 172Hz입니다. 파이썬에서 얻은 256 개의 값은 기본적으로 86 Hz에서 255 * 172 + 86 Hz = 43946 Hz까지의 주파수에 해당합니다. 당신이 나간 숫자는 복소수입니다 (따라서 매초마다 "j"가됩니다).

편집 : 고정 잘못된 정보

당신은 SQRT (내가 2 + J 2) i와 j는 실수 부와 허수 부분입니다, 인공 호흡기, 인공 계산하여 진폭에 복잡한 숫자를 변환해야합니다.

32 개의 막대를 갖고 싶다면 원하는대로 4 개의 연속 된 진폭의 평균을 취하여 256/4 = 32 막대를 가져와야합니다.

+0

안녕하세요, 초기 (잘못) 답변을 드려 죄송합니다. 수학을 올바르게받지 못했습니다. 이것은 지금 정확해야합니다. –

+4

c가 복소수 인 경우 큰 대답은 sqrt (c.real ** 2 + c.imag ** 2) == abs (c) – tzot

25

이 스레드는 세었지만 매우 유용하다는 것을 알았습니다. 나는 이것을 발견하고 유사한 것을 창조하려고하는 누군가에게 나의 의견을주고 싶었다.

바 (bar)로 나누는 것은 바의 수에 따라 데이터를 균등하게 나누어서 antti가 제안하는 것처럼해서는 안됩니다. 가장 유용한 방법은 데이터를 이전 옥타브의 두 배가되는 옥타브 부분으로 나누는 것입니다. (즉, 100hz는 50hz보다 한 옥타브 높고 25hz보다 한 옥타브 높습니다).

원하는 바의 수에 따라 전체 범위를 1/X 옥타브 범위로 나눕니다.

next lower = A/2^(1/X) 
next higher = A * 2^(1/X) 
: 당신이 유사한 계산을 사용하여 다음 인접한 중심 주파수를 계산하기 위해

upper limit = A * 2^(1/2X) 
lower limit = A/2^(1/2X) 

: 바에 주어진 중심 주파수를 기반으로, 당신은에서 막대의 상한과 하한을 얻을

그런 다음이 범위에 맞는 데이터를 평균하여 각 막대의 진폭을 구합니다.

예 : 1/3 옥타브 범위로 나누고 1khz의 중심 주파수로 시작합니다.

Upper limit = 1000 * 2^(1/(2 * 3)) = 1122.5 
Lower limit = 1000/2^(1/(2 * 3)) = 890.9 

감안할에서 44100Hz 1024 개 샘플 (각 데이터 포인트 사이 43hz) 우리 값 평균화한다 (21) (26) 내지 (890.9/43 = 20.72 ~ 21 1122.5/43 = 26.10 ~ 26)

(1/3 옥타브 바는 ~ 40hz ~ ~ 20khz 사이에서 약 30 개의 막대를 얻을 수 있습니다. 지금까지 알아낼 수 있듯이, 더 높아질수록 더 큰 범위의 숫자를 평균화합니다. 낮은 막대는 일반적으로 1 또는 소수의 데이터 요소 만 포함합니다. 높은 막대는 수백 포인트의 평균이 될 수 있습니다. 그 이유는 86hz는 43hz보다 높은 옥타브입니다 ... 10086hz는 10043hz와 거의 같은 소리입니다.

관련 문제