2016-06-29 6 views
1

정수 값을 가진 배열을 주파수 도메인으로 푸리에 변환해야합니다 (나중에 다른 것과 곱하기 위해). 출력 배열의 크기는 44100이어야하지만 입력 배열은 다양합니다.C++ : 어떻게 fftw3을 사용하여 다른 크기의 다른 배열로 푸리에 변환 할 수 있습니까?

나는 fftw3이 그 좋은 도구라고 생각한다. 하지만 입출력을위한 다양한 배열 크기의 '계획'을 어떻게 만듭니 까? 여기

은 내가 쓴 기능입니다 :

fftw_complex* fourier(int* samples, int numberOfSamples){ 

    fftw_complex* input; 
    fftw_complex* output; 
    fftw_plan plan; 
    input = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*numberOfSamples); 
    output = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*44100);     //cd-quality 

    plan = fftw_plan_dft_1d(44100, input, output, FFTW_FORWARD, FFTW_ESTIMATE); 
    // here is the problem because ^this 
    // array has a different size than 
    //          ^this array 

    for(size_t index = 0; index < numberOfSamples; index++){ 
     input[index][0] = (double)(samples[index]); 
     input[index][1] = 0; 
    } 
    fftw_execute(plan); 
    fftw_destroy_plan(plan); 
    fftw_free(input); 
    return output; 
} 

감사의 기본적인 수학 전제로,

+2

'44100'은 일종의 오디오 샘플링 속도처럼 보입니다. 일반적으로'fft' 배열의 크기는 샘플링 속도와 무관하며 2의 제곱입니다. 일반적으로 입력 및 출력 배열 크기는 수학 요구 사항 때문에 일치합니다. 실제 입력 데이터의 크기가 배열 크기와 일치하지 않으면이를 해결하기 위해 윈도우 잉과 제로 패딩 기술이 있습니다. 이 주제에 관한 충분한 문헌이 있습니다. – user3078414

+1

다른 사람들은 이미 입력 및 출력 길이가 일치해야 함을 언급했습니다. 어쩌면 당신이하려고하는 것에 대해 좀 더 많은 맥락을 줄 수 있습니다. 그 매직 넘버에 기초하여 당신은 Hz 당 1 빈 (아마)으로 파워 스펙트럼을 추정하려고합니다. 그렇다면 44100 샘플까지 입력을 제로화하고 스펙트럼을 부드럽게해야하는 입력 블록에 창 함수 (해닝 시도)를 적용하면됩니다. –

답변

3

이산 푸리에 항상 입력과 같은 크기의 출력을 생성 변환 응답에 대한 많은 이 알고리즘은 하나의 크기 매개 변수만을 사용하여 FFTW에 반영됩니다. 이것은 시간 도메인에서 N 개의 이산 값 배열에 대해 단위 시간당 0에서 N-1 사이클 (이 단위는 입력 시간 길이 임)부터 정확히 N 개의 가능한 고유 주파수가 재생되기 때문입니다.

기본적으로 입력을 늘리고 값을 보간하여 원하는 길이에 맞는 새 배열을 만든 다음 푸리에 변환을 수행하여 입력을 44100 값까지 위/아래로 확장 할 수 있습니다. 원하지 않는 아티팩트를 피하기 위해 주파수 영역이 아닌 입력 시간 영역에서이 스트레칭을 수행하는 것이 좋습니다.

+1

선형 보간은 할 수있는 최선의 방법입니까? 내 말은, 당신이 샘플을 가져 와서 가장 근사한 sinusodials의 합을 산출했다고 가정하고, 그것을 보간하기 위해 사용 했습니까? 이것은 주파수 영역에서 비교적 단순한 변환에 해당하며 더 좋은 방법 일 수 있습니까? – Yakk

+0

@ Yakk은 똑같은 일을하지 않을 것이며, 단지 n * log (n) 시간이 아니겠습니까? –

+2

입력을 늘릴 수는 없으므로 인위적인 결과가 발생합니다. 실제로 보간 할 필요가 있다면 (왜 여기에서 모든 것을 할 것인가는 알지 못합니다. 빈의 의미를 완전히 바꾼다고 가정하면) 제한된 펄스 모양의 나이 퀴 스트에 맞춰야합니다. 퍼포먼스에 관심이 있다면 주파수 도메인에서이 작업을 수행해야합니다. 만약 당신이 정말로 주파수 영역의 인공물에 대해 걱정할 필요가 있습니다. 순환 변환을 일반 원형으로 바꾸기 위해 변환을 오버랩하고 저장합니다. –