2014-01-12 13 views
0

У меня есть функция звука, которую я пытаюсь разбить на синусы/косинусы. Поэтому я прибегал к быстрой трансформации Фурье. Используя функцию fft(y,inverse=FALSE), я смог преобразовать временную область звука в частотный doman. Результат сложный. Я прочитал, что для преобразования этого вывода, который находится в мнимой форме, и отсеивает необходимую информацию, которая является амплитудой и фазой A(v)cos(2*pi*v+P), для получения амплитуды необходимо использовать выходной сигнал abs(); однако мне трудно найти функцию R, которая получает фазу. В MATLAB функция angle() возвращает фазы БПФ. Какова соответствующая функция в R, чтобы найти фазу?Амплитуда и фаза FFT

Update

Спасибо за предложения, ребята; все еще испытывают проблему. Я запускаю FFT на простой функции, чтобы проверить, работает ли она. Моя функция: y=cos(2*pi*(seq(0,10,by=.01)*(1/5)+7.5). Таким образом, частота составляет 1/5 с фазовым сдвигом 7,5.

y=cos(2*pi*(seq(0,10,by=.01)*(1/5)+7.5) 
fty=(y,inverse=F) 
plot(abs(fty),xlim=c(0,10),type="l") 
angle=atan2(Im(fty), Re(fty)) 
> angle[3] 
[1] 1.222766 

Когда я сюжет серии, амплитуда достигает максимума при значении частоты 3 и функции угла (который должен дать мне мою фазу на частоте, при которой амплитуда которой пики при) дает мне фазу 1.2 , Что я делаю не так? enter image description here

+0

Фаза 7,5 (радиан) будет уменьшена по модулю 2pi. Если вы вычтите 2 * 3.14 с 7.5, вы получите около 1,2, как вы нашли. – Floris

+0

Спасибо Флорис. Как насчет частоты? На выходе у меня была ячейка частоты 3, какая операция регулирует значение до 1/5? – jessica

+0

Первый бит содержит компонент постоянного тока; третий бит содержит частоту, которая соответствует ровно в два раза. У вас есть '2 * pi * seq (0,10, by = 0.01) * (1/5)', которую мы можем переписать как «2 * pi * seq (0,2, на = 0,002)». Таким образом, вы можете получить ровно две формы сигнала (10/5 = 2), и вы увидите пик в бункере 3, как ожидалось. Для перехода в другую сторону (maxBin - 1)/maxTime = (3 - 1)/10 = 1/5. Имеют смысл? – Floris

ответ

2

Вы можете обнаружить, что функция atan2 делает то, что вы хотите. Вы дадите ему воображаемые и реальные части ценности, так как прототип - atan2(y, x). Таким образом, вы могли бы сделать:

angle = atan2(Im(value), Re(value)); 
+3

Должно быть 'Im' и' Re' –

+0

Благодарим за помощь Флорис! Выход из 'fft()' имеет форму 'a + bi', поэтому он включает в себя действительную и сложную функцию. Как разобрать 'a' из' b' в выходном векторе? Являются ли фактические функции 'im' и' re' в R? Если да, то какой пакет? – jessica

+1

'Im' и' Re' (sic) находятся в базе R, и они отвечают на ваш вопрос. 'x <- complex (real = 2: 3, imaginary = 1: 2); печать (х); Im (х); Re (x) ' –

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