![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| svip |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 27.3.2007 Репутация: нет Всего: нет |
Есть аналоговый сигнал частотой от 0 до 1 Гц. Оцифровали его через АЦП и нужно програмно выделить четыре частоты из него (0.12 0.8 0.6 0.4 Гц).
Помогите разобраться. (Курсовая горит) |
|||
|
||||
| svip |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 27.3.2007 Репутация: нет Всего: нет |
неужели никто не знает или нехочет помочь?
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
svip, легко прогони его через фурье (БПФ), в комплексном спектре оставь только нужную компоненту (слева и справа) и обратным БПФ получиться нужная составляющая.
Пример реализации фурье есть в DRKB. Это сообщение отредактировал(а) Alexeis - 27.3.2007, 18:16 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| svip |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 27.3.2007 Репутация: нет Всего: нет |
а пример кода можно привести
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Этот код не оптимальный так как использует вычисления с плавающей точкой и классической преобразование фурье для 4096 точек, частота дискретизации принята 400 Гц.
Внимание, расчет достаточно длительный и на процессоре Athlon 3800+ занял несколько секунд. Для столь низких частот желательно уменьшить частоту дискретизации например 40Гц, и соответственно уменьшить число точек преобразования например до 512, тогда скорость многократно возрастет. Длинные буфера нужно разбивать на блоки по длине равной длине буфера фурье и преобразовывать поблочно. Вот такой получился простенький пример
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Вот наконец нашел реализацию алгоритма БПФ для целочисленных операций (к сожалению нет сведений об авторе кода)
Алгоритм быстрого преобразование Фурье на 1024 точек (перевод в частотную область) //вспомогательные массивы для ускорения обработки
![]()
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| svip |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 27.3.2007 Репутация: нет Всего: нет |
ограмное спасибо за примеры.
На сколько я понял fr1 = 0.12; fr2 = 0.6; fr3 = 0.8; fr4 = 0.4; мы складываем и получаем смешанную частоту, а что получаем путем вычисления? со вторым примеров вообще не разобрался если можете объясните поподробнее на пальцах непонятливому студенту извените за такие банальные вопросы, но чего то я не понимаю, а обязательно нужно разобраться |
|||
|
||||
| Alexeis |
|
||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
У меня же нет оцифрованного сигнала. Вот я его заменил искуственным. Путем вычисления сначала получаем комплексный спектр сигнала, затем оставляем все компоненты кроме нужной нам, а остальные зануляем. После чего обратным преобразованием фурье получем отфльтрованную компоненту (то что требуется по условию). Но приведенный алгоритм классического фурье медленный, потому второй пример есть реализация целочисленного БПФ, который многократно быстрее, но с ним и больше возни.
Рисуем исходный сигнал. ClassicDirect(Source, Cx, Cy, 4096); - прямое фурье n := round(fr1 / Diskr * 4096); - номер нужной компоненты в спектре
Удаление лишних компонент ClassicInverce(Cx, Cy, Fr0_4, 4096); восстановление сигнала (обратное фурье)
Рисуем результат -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
| svip |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 27.3.2007 Репутация: нет Всего: нет |
спасибо вроде разобрался. А не подскажите где можно найти информацию по второму примеру, тобы тоже понять как его использовать
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Точно также как и обычное фурье, только для его работы сначала вычисляется таблица синусов и косинусов и данные должны быть целочисленными.
re,im - входные выходные массивы данных как для прямого так и для обратного фурье. Для прямого исходные данные помещаются в re, im должен быть заполнен нулями. Для обратного входные это re, im, результат возвращается в re. Если что его можно "подрихтовать" для нужного количества точек. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |