2013-03-20 2 views
0

Я пытаюсь восстановить фазы простой (аудио) сигнала в MATLAB: В MATLAB я следующее:Восстановление фазы из FFT

% This wave is perfectly periodic in the sample. That is, 
% there are exactly 1000 periods. 
swave = sin(2 * pi * (0:10000) * 441/44100); 

% Find the fft 
sFFT = fft(swave); 
% Remove the duplicate data in the FFT 
sFFT = sFFT(1:length(sFFT)/2); 

% Take a look a the amplitudes from the FFT and it checks out 
freqs = 44100/ 2*linspace(0,1,length(sFFT); 
plot(freqs, abs(sFFT)); 

% Now to get the phase 
plot(freqs, angle(sFFT)); 

Этот результат не дает почти никакого смысла для меня. Потому что это волна sin (не волна cos). Я ожидаю увидеть 1/2 * pi = 1.57079 для значения 441hz bin. Вместо этого я вижу почти прерывистый переход от (441, -1.539) к (445, 1.603). Почему 441 пока не соответствует правильному значению? Почему 445 так близко?

Значение для всех бункеров, кроме 441 hz, является для меня загадкой. Я также пробовал несколько других методов восстановления фазы, включая разворот (угол (sFFT)) и atan2 (imag (sFFT), real (sFFT)); Они меняют результат, но также не имеют для меня никакого смысла. Почему бины, кроме 441, имеют значение, но 0 (как показывает абс (FFT)?). Почему 441 бит закрывается, но не правильное значение?

Спасибо за помощь!

+3

Вы попробовали 'unwrap'? он корректирует фазовые углы для получения более плавных фазовых графиков, см. http://www.mathworks.com/help/matlab/ref/unwrap.html – bla

ответ

0

Чтобы лучше оценить фазу, измените опорную фазу 0 на центр окна, выполнив fftshift, что должно устранить большую часть чередующихся фазовых разрывов, а затем интерполировать, но отметив, что вы изменили свою 0-ю точку.

Обратите внимание, что фаза вектора нулевой длины в большинстве случаев бессмысленна, и, следовательно, что-либо близко, скорее всего, просто числовой шум (около нулевых векторов в разных случайных направлениях) из-за математики с конечной точностью.

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

+0

Я переместил fft так, чтобы 0hz был центрирован на графике; левая половина графа - это частоты, а правая половина - + частоты. Как это помогает? Что вы имеете в виду, когда говорите, что это «должно устранить большую часть чередующихся фазовых разрывов». Кроме того, какую интерполяцию вы предлагаете мне? Вы предлагаете нулевые измерения фазы, которые не превышают определенного порога, полезно для удаления большинства фазовых данных «шума». Тем не менее, это не помогает мне понять фазу чтения на 441 Гц, что меня больше всего интересует. – user2109

+0

Fftshift сдвигает данные перед БПФ или поворачивает каждый другой сложный бит после. Это перемещает ссылку для фазы нуля в средний образец данных, где нет разрыва. Лучше всего было бы использовать интерполяцию с ядром Sinc (windowed). – hotpaw2

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