Я хочу создать звуковое моделирование виртуальной сцены. Поэтому я хочу сверлить импульсный отклик, который моя система рассчитывает с помощью входного сигнала из простого .wav-файла в зависимости от частоты. Насколько я понимаю DSP, лучший способ - использовать FFT для преобразования входного сигнала в его частотный спектр, как-то применить к нему функцию импульсного отклика и iFFT его обратно.Сигнал после обработки с помощью FFT, а затем IFFT не то же самое
Моя проблема в том, что после выполнения БПФ на моем сигнале, а затем iFFT, сигнал отличается от исходного входного сигнала. Оригинальный звук распознается в новом сигнале, но он очень «размыт» из-за ложных чисел после FFT и iFFT. Я использовал пример внедрения «первый» (на месте, в ширину, первый раз) в C++ с http://rosettacode.org/wiki/Fast_Fourier_transform#C.2B.2B.
Вот код моего внутреннего использования кода реализации FFT:
CArray signal = CArray(output_size);
for (int i = 0; i < format.FrameCount; ++i) {
signal[i] = Complex((double)(is_8_bit ? sample_data_8[i] : sample_data_16[i]), 0);
}
fft(signal);
ifft(signal);
Следующие определения типов существуют:
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
Поскольку я взял код из приведенного выше сайта, я предположим, что ошибка не может быть в реализации БПФ. Я предполагаю, что он должен что-то сделать с типом данных моего ввода и/или с комплексными числами.
Поскольку моя система не реализует «фазу», и я читал, что ими можно пренебречь, и все еще можно вернуть полезное значение, я инициализация комплексных чисел с мнимой частью 0.
Есть фундаментальная ошибка, которую я совершил или является виной в чем-то вроде типов данных или округления, где это не должно быть?
Какова частота дискретизации? – alexm
использование matlab для этого – dynamic
@alexm Частота дискретизации 22050 Гц. – Telefonica