kiss_fftr, за которым следует kiss_fftri (с очень большим размером окна), не возвращает входной сигнал

Я выполняю взаимную корреляцию между более коротким клипом аудио (44100 * 14 сэмплов) и намного более длинным клипом аудио (44100 * 60 * 6 сэмплов). Из того, что я понимаю, я не могу открыть FFT из-за этого. При тестировании kiss_fftr и kiss_fftri я обнаружил, что обратная операция в значительной степени возвращает шум (но она все еще ритмично похожа на ввод). Я подтвердил, что мой входной звук правильный, и повреждение происходит только в этой функции:

static std::vector<std::vector<float>> do_fft(std::vector<std::vector<float>> song, std::vector<std::vector<float>> loop)
{
loop[0].resize(kiss_fftr_next_fast_size_real(loop[0].size())); // TODO: resize this to song size instead of loop size when done testing
loop[1].resize(loop[0].size()); // TODO: make this dynamic

std::vector<std::vector<kiss_fft_cpx>> fft_loop;
std::vector<std::vector<float>> output;

for (int chan = 0; chan < loop.size(); chan++)
{
fft_loop.push_back(std::vector<kiss_fft_cpx>());
fft_loop[chan].resize(loop[chan].size());

output.push_back(std::vector<float>());
output[chan].resize(loop[chan].size()); // TODO: resize this to song size instead of loop size when done testing
}

kiss_fftr_cfg cfg_loop = kiss_fftr_alloc(loop[0].size(), 0, NULL, NULL);
kiss_fftr(cfg_loop, &loop[0][0], &fft_loop[0][0]);
kiss_fft_free(cfg_loop);

kiss_fftr_cfg cfgi_loop = kiss_fftr_alloc(fft_loop[0].size(), 1, NULL, NULL);
kiss_fftri(cfgi_loop, &fft_loop[0][0], &output[0][0]);
kiss_fft_free(cfgi_loop);

return output;
}

Вот как выглядит вывод по сравнению с вводом:

Увеличено, чтобы показать детали:

Если вас интересует память, программа является 64-битной и использует всего несколько гигабайт оперативной памяти (всего несколько концертов, ничего особенного :П)

0

Решение

Различные библиотеки FFT используют разные коэффициенты масштабирования и / или по-разному распределяют коэффициенты масштабирования между своими реализациями FFT и IFFT.

kiss_fft требует, чтобы вы уменьшали длину fft во время или между парой fft / ifft, чтобы получить обратно (приблизительно в пределах ошибки чисел или округления) исходный входной вектор во временной области.

В вашем случае это довольно большой масштабный коэффициент, потому что длина ваших данных большая.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]