정수 값을 가진 배열을 주파수 도메인으로 푸리에 변환해야합니다 (나중에 다른 것과 곱하기 위해). 출력 배열의 크기는 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;
}
감사의 기본적인 수학 전제로,
'44100'은 일종의 오디오 샘플링 속도처럼 보입니다. 일반적으로'fft' 배열의 크기는 샘플링 속도와 무관하며 2의 제곱입니다. 일반적으로 입력 및 출력 배열 크기는 수학 요구 사항 때문에 일치합니다. 실제 입력 데이터의 크기가 배열 크기와 일치하지 않으면이를 해결하기 위해 윈도우 잉과 제로 패딩 기술이 있습니다. 이 주제에 관한 충분한 문헌이 있습니다. – user3078414
다른 사람들은 이미 입력 및 출력 길이가 일치해야 함을 언급했습니다. 어쩌면 당신이하려고하는 것에 대해 좀 더 많은 맥락을 줄 수 있습니다. 그 매직 넘버에 기초하여 당신은 Hz 당 1 빈 (아마)으로 파워 스펙트럼을 추정하려고합니다. 그렇다면 44100 샘플까지 입력을 제로화하고 스펙트럼을 부드럽게해야하는 입력 블록에 창 함수 (해닝 시도)를 적용하면됩니다. –