2015-09-09 4 views
0

Я делаю некоторые преобразования Фурье аудио (.wav) данных с помощью команды FFT в MATLAB. Входными значениями являются числа от -1,0 до 1,0Масштаб вывода FFT (MATLAB)

Я понимаю, что после принятия абсолютного значения (модуля) выходного сигнала БПФ я должен получить значения, имеющие единицы амплитуды, но фактические значения находятся на порядка тысяч. Это не имеет смысла, поскольку теоретически я должен был бы суммировать компоненты Фурье, чтобы вернуть исходный сигнал. Я чувствую, что выход должен также быть между 0 и 1, так что здесь? Я предполагаю, что алгоритм БПФ удаляет его из пропорции, но я не уверен, какую ценность использовать для его масштабирования.

ответ

2

БПФ - это алгоритм для вычисления дискретного преобразования Фурье (ДПФ). inverse DFT (IDFT) имеет в своем определении коэффициент масштабирования 1/N. Возможно, это вас смущает. Из Википедии:

  • ДПФ (от конечной последовательности х к коэффициентов Фурье Х):

    enter image description here

  • IDFT (от Х обратно в х):

    enter image description here

Так, просто применить ifft к результату fft и вы получите оригинальный результат. Например:

>> x = linspace(-1,1,5) 
x = 
    -1.0000 -0.5000   0 0.5000 1.0000 

>> y = fft(x) 
y = 
     0   -1.2500 + 1.7205i -1.2500 + 0.4061i -1.2500 - 0.4061i -1.2500 - 1.7205i 

>> abs(y) 
ans = 
     0 2.1266 1.3143 1.3143 2.1266 %// note values greater than 1 

>> ifft(y) 
ans = 
    -1.0000 -0.5000 0.0000 0.5000 1.0000 

В самом деле, IDFT может быть expressed in terms of the DFT применяя комплексное сопряжение и упомянутый коэффициент масштабирования. Обозначая ДПФ Р, то IDFT от F -1 и комплексно сопряженное с *,

enter image description here

В приведенном выше примере,

>> 1/numel(y) * conj(fft(conj(y))) 
ans = 
    -1.0000 -0.5000 0.0000 0.5000 1.0000 
+0

Конечно, альтернативное (и одинаково действительное) определение имеет термин 'sqrt (1/N)' как в ДПФ, так и в IDFT, что, вероятно, дает результаты, ожидаемые OP –

+1

@BenVoigt Хорошая точка. Но 1-масштабирование для DFT и 1/N-масштабирования для IDFT является наиболее распространенным определением, по крайней мере, в моем опыте –

+0

Я думаю, что я понимаю, что есть искажение масштаба из-за суммирования по n для каждого X_k, но есть ли способ восстановить правильное масштабирование?То есть, если входной сигнал был чем-то вроде прямоугольной волны, когда делались аналитические выводы, это были бы нечетные гармоники с –

0

В Matlab использовать следующие код для масштабирования от 1 до (примерно) 0.

dataDFT=abs(fft(data)); % Take the complex magnitude of the fft of your data 
dataDFTScaled=dataDFT/max(dataDFT); % Divide by the maximum value 

Вы не хотите, чтобы он масштабировался до нуля, потому что это сделало бы невозможным просмотр на графике журнала.