2015-09-04 2 views
0

Я хочу создать звуковое моделирование виртуальной сцены. Поэтому я хочу сверлить импульсный отклик, который моя система рассчитывает с помощью входного сигнала из простого .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.

Есть фундаментальная ошибка, которую я совершил или является виной в чем-то вроде типов данных или округления, где это не должно быть?

+0

Какова частота дискретизации? – alexm

+0

использование matlab для этого – dynamic

+0

@alexm Частота дискретизации 22050 Гц. – Telefonica

ответ

-1

Для получения правильного результата необходимо иметь 2^n выборок. Если у вас меньше 2^n выборок, просто добавьте нули в конце сигнала. Например, сигнал (1,0,1,1,1) будет (1,0,1,1,1,0,0,0).

0

Проверьте, не является ли это ошибкой масштабирования. Во многих случаях (но не все), БПФ и ОБПФ реализуются без деления на число образца, таким образом, для сигнала длины N только

iFFT(FFT(signal))/N 

возвращает исходное signal.


Для серьезной трансформационной работы найдите нулевое дополнение и окно.

+0

Нормализованная часть алгоритма «прореживания частоты» была как-то проблемой. Если я вложу образец 2^n, он будет работать. Я попробовал снова использовать исходный источник, сделать iFFT (FFT (сигнал)), а затем разделить каждый образец на signal.size(), но это не принесло мне правильного результата. Если я неправильно понял часть/N, сообщите мне об этом. Спасибо за условия. Я буду искать их. – Telefonica

+0

Да, это кажется правильной процедурой. Либо вариант с, либо вариант без деления на N = signal.size() должны работать последовательно. В документации должно быть указано, допустимы ли диадические или общие длины. Общая длина требует больших библиотек, таких как FFTW или Spiral, реализующих несколько различных алгоритмов FFT (Bluestein, Winograd, Rader (?)). Предоставление недиадической длины простой реализации Кули-Туки может дать странные результаты. – LutzL

Смежные вопросы