Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.126.11] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Доброй ночи .
Как реализовать вывод частоты с максимальной амплитудой на промежутке от 0 до 120Гц. С частотой дискретизации 240 Гц . Прошу помочь в написании кода на С , потому что в математике 0 . |
Сообщ.
#2
,
|
|
|
Взять входной массив
Выполнить FFT Вычислить амплитуду комплексного результата как корень из суммы квадратов мнимой и реальной части Найти максимальный отcчёт амплитуды. Частота сигнала Fдискр/2 соответствует N/2 отсчёту массива после преобразования (вторая часть - зеркальное отражение). |
Сообщ.
#3
,
|
|
|
Прошу помочь написать код так как для меня FFT темный лес
|
Сообщ.
#4
,
|
|
|
Этих кодов в инете да и на этом форуме немало
|
Сообщ.
#5
,
|
|
|
Увы не особо то в интернете не то что надо везде спектр отображают в виде графики , а мне нужно допустим играет музыка , раз максимальная амплитуда 77Гц потом второй пик 35Гц и так далее . Вот эти показания мне и надо в цифрах
|
Сообщ.
#6
,
|
|
|
i-й отсчет соответствует частоте Fдискр * i / N
|
Сообщ.
#7
,
|
|
|
Цитата gmaxi @ на промежутке от 0 до 120Гц. С частотой дискретизации 240 Гц . Что-то здесь не сходится. |
Сообщ.
#8
,
|
|
|
Mikle
Почему? |
Сообщ.
#9
,
|
|
|
Цитата MBo @ Почему? Каков уровень будет на 0 Гц? |
Сообщ.
#10
,
|
|
|
Постоянная составляющая
|
Сообщ.
#11
,
|
|
|
Цитата MBo @ Постоянная составляющая Верно, а FFT её выдаст? За сколько семплов? |
Сообщ.
#12
,
|
|
|
Mikle
К чему вы клоните? Выдаст, чем больше семплов тем лучше. Для точного восстановления гармоник нужна частота дискретизации в 2 раза большая. |
Сообщ.
#13
,
|
|
|
>Верно, а FFT её выдаст? За сколько семплов?
Недопонимаю смысл вопроса. Нулевую выдаст всегда. Какова её интенсивность - зависит от сигнала. От количества семплов (временного интервала) зависит частотное разрешение. Слишком мало (нечёткое понятие) семплов - амплитуды неточные. |
Сообщ.
#14
,
|
|
|
function DetectFirstF2(a:TArrayReal; t:Real; dwSamplesPerSec:DWord):Real; var i,N,NewN:Integer; aa,b:TArrayReal; z:TArrayComplex; r:Real; fd:Real; v0,v1,v2:Real; begin fd:=dwSamplesPerSec; N:=Length(a); NewN:=(1 shl Log2Int(n))*32; aa:=copy(a); r:=Mean(aa); // Находим среднее sub(aa,r); // Убираем постоянную составляющую. HammingMulWindow(n,@aa[0]); SetLength(aa,NewN); CopyInRe(z,aa); FFT(z,False); // Получаем спектр частот amp(b,z); // Вычисляем амплитуду for i:=1 to Length(b)-2 do b[i]:=0.25*b[i-1]+0.5*b[i]+0.25*b[i+1]; // Убираем небольшие шумы, могут влиять на знак 1 производной. for i:=6 to Length(b) div 2 do // Отбрасываем первые частоты, которые могут помешать.И отбрасываем отрицательные частоты (div 2). begin if (b[i]>t*N/NewN) and (b[i]-b[i-1]>0) and (b[i]-b[i+1]>0) then // проверяем порог и условие выпуклости по произволдням(точка больше двух соседних) begin GetParabola(Point2DReal(i-1,b[i-1]),Point2DReal(i,b[i]),Point2DReal(i+1,b[i+1]),v0,v1,v2); // Вычисляем коэффициенты параболы для уточнения частоты Result:=(-v1/2/v0)*Fd/(NewN); // Находим максимум параболы и пересчитываем координату в частоту Exit; end; end; end; |
Сообщ.
#15
,
|
|
|
Теоретически точность определения амплитуды гармоники растёт с ростом отношения длительности выборки к периоду. Когда выборка короче половины периода, определять нечего вообще - период при нуле равен бесконечности.
Для определения постоянной составляющий нужно иметь историю сигнала на бесконечность назад. Могу на примере объяснить, лень писать, но, вроде бы, и так понятно. Если надо будет - распишу подробнее. |