У меня есть функция звука, которую я пытаюсь разбить на синусы/косинусы. Поэтому я прибегал к быстрой трансформации Фурье. Используя функцию 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 , Что я делаю не так?
Фаза 7,5 (радиан) будет уменьшена по модулю 2pi. Если вы вычтите 2 * 3.14 с 7.5, вы получите около 1,2, как вы нашли. – Floris
Спасибо Флорис. Как насчет частоты? На выходе у меня была ячейка частоты 3, какая операция регулирует значение до 1/5? – jessica
Первый бит содержит компонент постоянного тока; третий бит содержит частоту, которая соответствует ровно в два раза. У вас есть '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