2011-09-21 5 views
5

여기에 다양한 FFT 질문을 보았습니다. 그러나 구현의 일부에서 혼란스러워합니다. 실시간으로 FFT를 수행하는 대신 오프라인으로 수행하려고합니다. 내가 float[] audio에 원시 데이터를 가지고 있다고합시다. 샘플링 속도는 44100이므로 audio[0] to audio[44099]에는 1 초 분량의 오디오가 포함됩니다. 내 FFT 함수가 윈도우 처리 (예 : 해닝)를 처리하는 경우 전체에서 audio 버퍼를 한 번에 함수에 넣을 수 있습니까? 또는 4096 (내 창 크기)의 청크로 오디오를 잘라낸 다음 FFT에 입력하여 그 위에 윈도우 기능을 수행해야합니까?FFT - 언제 창가로 나옵니까?

+1

는 확실히 이것은 FFT 라이브러리의 특성에 따라 달라집니다 당신을 사용하고 있습니다. – Mankarse

+0

이 질문은 dsp.stackexchange.com에 더 적합합니다. 그것은 움직여야 하는가? –

+0

@Mankarse - 네, 죄송합니다. 좀 더 구체적으로해야했습니다. 나는 세 가지 다른 FFT 라이브러리를 가지고 있었고 어떤 라이브러리를 사용할 지 확신하지 못했습니다. 나는 Apple의 Accelerate 프레임 워크에서 이것을 사용하기로 결정했습니다. – Skoder

답변

2

입력 데이터를 별도의 버퍼에 복사하여 올바른 형식으로 가져와야 할 수 있습니다 (예 : FFT가 현재 위치에 있거나 인터리브 된 복합 데이터 (실수/허수)가 필요한 경우. 그러나 FFT 루틴이 실제 입력을 받아 들일 수 있고 적절한 위치 매개 변수 (예 : 비파괴)가 아니라면 적절한 크기 매개 변수와 함께 원본 샘플 데이터에 포인터를 전달할 수 있습니다.

일반적으로 오디오 1 분 동안, 예를 들어. 음성이나 음악과 같이 합리적으로 고정 된 청크에 해당하는 FFT 크기를 선택합니다. 10 ms 또는 20 ms. 따라서 44.1 kHz에서 FFT 크기는 512 또는 1024라고 말할 수 있습니다. 버퍼를 통과하고 각 시작 지점에서 새로운 FFT를 수행하여 연속 스펙트럼을 생성합니다. 연속 버퍼를 일반적으로 50 % 겹치게하는 것이 일반적입니다. 따라서 N = 1024이면 첫 번째 FFT는 샘플 0..1023이고 두 번째는 샘플 512..1535, 그 다음 10244..2047 등이 될 것입니다.

+0

도움 폴을 보내 주셔서 감사합니다. 필자는 Apple의 Accelerate 프레임 워크를 사용하려고합니다. 즉, 인플레 이스 (in-place) FFT를 수행하므로 별도의 버퍼에서 데이터를 조작해야한다고 생각합니다. 따라서 180 초 길이의 노래가있는 경우 설명 된대로 버퍼를 반복하고 N = 7938000 (44100 * 180)까지 FFT를 수행합니까? – Skoder

+2

함수 이름이 "ip"로 끝나면 해당 위치에 있습니다 (예 :. 'vDSP_fft_zrip'. 그래서 예, 입력 데이터의 각 청크를 적합한 FFT 버퍼에 복사하거나, 창 함수 (예 : 한)를 적용하거나, FFT를 적용하거나, 파워 스펙트럼 또는 원하는 작업을 수행하고,이 청크의 파워 스펙트럼을 저장 및/표시하거나, 다음 덩어리로 ... –

+1

참고 : http://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework –

1

선택한 청크 크기 또는 창 길이는 주파수 해상도 및 FFT 결과의 시간 분해능을 포함한다. 원하는 대상이나 트레이드 오프를 결정해야합니다.

긴 창을 사용하면 주파수 해상도는 향상되지만 시간 해상도는 나 빠진다. 더 짧은 창. 반대의 경우도 마찬가지입니다. 각 FFT 결과 bin에는 하나의 단일 주파수뿐만 아니라 창 모양 (직사각형, 폰 한 등)에 따라 샘플 속도를 FFT 길이로 나눈 값의 대략 1 ~ 2 배의 주파수 대역폭이 포함됩니다. 전체 데이터 청크가 고정되어 있으면 (주파수 내용이 변경되지 않음) 시간 해상도가 필요하지 않을 수 있으며 1 초의 데이터에서 1 ~ 2Hz 주파수 "해상도"로 이동할 수 있습니다. 짧은 FFT 창을 여러 개 평균화하면 스펙트럼 추정의 분산을 줄일 수 있습니다.

+0

잘 알고 있는지 잘 모르겠지만 AudioSurf와 비슷한 것을 만들려고합니다 (이 동영상은 http://www.youtube.com/watch?v=에서 약 20 초 정도의 템포를 인식하는 좋은 예입니다). 2EsVyEnhxWY). AudioSurf는 오디오를 실시간으로 처리하는 대신 사전 처리하고 이것이 어떻게 수행되었는지는 확실하지 않았습니다. – XSL

+0

@SSL - 왜 템포 인식을 위해 단지 1 초의 FFT 만보고 있습니까? 또는 이것이 OP의 원래 질문을 넘어서는 것이라면, 아마 당신은 새로운 질문을해야 할 것입니다. – hotpaw2

+0

그것은 원래의 질문을 넘어서는 것이었지만 나는 OP와 똑같은 것에 대해 궁금해했습니다. 지금 당장은 정보가 필요 없으므로 그 다리를 건너 가면 새 스레드를 만들 것입니다. – XSL

2

전체 데이터 세트 (OP의 경우, 1 초의 데이터를 나타내는 44100 샘플)에 대해 하나의 FFT를 계산할지 또는 전체 데이터 세트의 더 작은 서브 세트에 대해 일련의 FFT를 수행할지 여부를 선택하는 것은, 데이터 및 FFT의 의도 된 목적에 따라 달라집니다.

데이터가 전체 데이터 세트에 대해 상대적으로 정적으로 정적 인 경우 전체 데이터 세트에 대해 하나의 FFT가 필요할 것입니다.

그러나 데이터가 데이터 세트에 대해 스펙트럼 적으로 동적 인 경우 데이터의 작은 하위 집합에 대해 여러 개의 슬라이딩 FFT가 데이터의보다 정확한 시간 - 주파수 표현을 생성합니다.

아래 그림은 A4 음을 연주하는 어쿠스틱 기타의 파워 스펙트럼을 보여줍니다. 오디오 신호는 44.1 KHz에서 샘플링되었으며 데이터 세트에는 약 3 초의 데이터 인 131072 개의 샘플이 포함되어 있습니다. 이 데이터 세트는 한 창 함수로 미리 곱 해졌습니다.

Guitar spectrum, Hann window, 131072 samples

아래 그래프는 어쿠스틱 기타 A4 메모의 전체 데이터 세트로부터 취해진 샘플 16384 (0 16383)의 서브 세트의 파워 스펙트럼을 나타낸다. 이 부분 집합은 또한 한 창 함수로 미리 곱 해졌습니다.부분 집합의 스펙트럼 에너지 분포가 전체 데이터 세트의 스펙트럼 에너지 분포에서 유의 한 차이가 얼마나

Guitar spectrum, Hann window, 16384 samples

알 수 있습니다.

슬라이딩 16384 샘플 프레임을 사용하여 전체 데이터 세트에서 하위 세트를 추출하고 각 프레임의 파워 스펙트럼을 계산할 경우 전체 데이터 세트의 정확한 시간 - 주파수 영상을 생성합니다.

참고 :

리얼 오디오 신호 데이터에서 Hann의 윈도우 함수, 그래프, FFT, 스펙트럼 분석은 여기에서 행해졌 다 :

Fast Fourier Transform, spectral analysis, Hann window function, audio data