Перейти к содержанию
    

Микроконтроллерный БПФ для совсем чайников в ЦОС

Есть задача: микроконтроллер (PIC32MM)  складывает в массив на 1024 отсчёта оцифрованный некий входной сигнал.

Нужно выделить частоту/гармонику с максимальной амплитудой. Провёл за гуглением несколько дней. Скажу честно, далёк я от самостоятельной реализации БПФ на основе просто алгоритмов и графов. Попробовал ДПФ, которое гораздо попроще, но скорость не просто не устраивает, а сильно не устраивает. Нашлась относительно простая реализация

https://www.silabs.com/documents/public/application-notes/an142.pdf

Которую в данный момент изучаю. Но очень она громоздкая. Может кто подскажет более компактную реализацию. 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритм Гертцеля ?

А в АОНах 90-х годов использовался т.н. Корреляционный алгоритм (там нужно было выделить две частоты). Работало даже на AT89C51 в реальном времени ...

 

Вот, нашел в архиве:

 

https://mega.dp.ua/ru/AXPD

 

И вот, например:

 

https://www.google.com/search?q=Программное+дeкодирование+DTMF&biw=1600&bih=771&ei=Egn7YaXJMoP2qwHaqaL4AQ&ved=0ahUKEwilms75i-L1AhUD-yoKHdqUCB8Q4dUDCA0&uact=5&oq=Программное+дeкодирование+DTMF&gs_lcp=Cgdnd3Mtd2l6EANKBQg8EgExSgQIQRgBSgQIRhgAULYHWLYHYL8JaAFwAHgAgAFyiAFykgEDMC4xmAEAoAECoAEBwAEB&sclient=gws-wiz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота заранее неизвестна. Собственно нужно в произвольном сигнале найти "палку" максимальной амплитуды и определить частоту. По порядковому номеру, как я понимаю.

ПыСы пасиб, изучу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда БПФ. Вот, из того же архива. Посмотрите, может помочь:

 

https://mega2.dp.ua/ru/UkBV9

 

Много лет назад я делал кому-то диплом и писал свою реализацию БПФ на Turbo Pascal:

 

https://mega2.dp.ua/ru/hHQCT7yU6

 

Оно все разбираемо, но придется потрудиться. В конце концов, в Сети наверняка есть масса готовых реализаций БПФ в виде тех же библиотек.

 

Или вот еще - спектроанализаторы на МК, их не так-то и мало:

 

http://pic.rkniga.ru/shemotehnika/izmeritelnaya-tehnika/265-analizator-spektra-v-realnom-vremeni-na-pic18f4550.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, kovigor сказал:

В конце концов, в Сети наверняка есть масса готовых реализаций БПФ в виде тех же библиотек.

В сеть ходить даже не надо и ковыряться в той помойке. Ставим CCS (Code Composer Studio), находим в ней DSPLIB, а в той - целую кучу различных функций численной математики. В том числе и пачку разных функций БПФ в самых различных вариациях под самые разные поддерживаемые CCS ядра и всё - в исходниках. Как на asm так и на си.

Наверное и в других компиляторах что-то подобное есть. По-крайней мере в своём "IAR for ARM" вижу директорию: "IAR\EWARM_7.80.4\arm\CMSIS\DSP_Lib\Source\TransformFunctions" в которой целая пачка файлов на все вкусы:

Цитата

arm_bitreversal.c
arm_bitreversal2.S
arm_cfft_f32.c
arm_cfft_q15.c
arm_cfft_q31.c
arm_cfft_radix2_f32.c
arm_cfft_radix2_init_f32.c
arm_cfft_radix2_init_q15.c
arm_cfft_radix2_init_q31.c
arm_cfft_radix2_q15.c
arm_cfft_radix2_q31.c
arm_cfft_radix4_f32.c
arm_cfft_radix4_init_f32.c
arm_cfft_radix4_init_q15.c
arm_cfft_radix4_init_q31.c
arm_cfft_radix4_q15.c
arm_cfft_radix4_q31.c
arm_cfft_radix8_f32.c
arm_dct4_f32.c
arm_dct4_init_f32.c
arm_dct4_init_q15.c
arm_dct4_init_q31.c
arm_dct4_q15.c
arm_dct4_q31.c
arm_rfft_f32.c
arm_rfft_fast_f32.c
arm_rfft_fast_init_f32.c
arm_rfft_init_f32.c
arm_rfft_init_q15.c
arm_rfft_init_q31.c
arm_rfft_q15.c
arm_rfft_q31.c

PS: Про "ARM for PIC" не скажу. В виду отсутствия оного у меня.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут одна тонкость. До тех пор, пока человек не поймет, как работает ДПФ, все эти готовые реализации скорее вредны, чем полезны ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как работает ДПФ я можно сказать почти понимаю. По крайней мере улавливаю физический смысл. Меня в ужас приводят свёртки - бабочки БПФ.

Если бы это было делом всей моей жизни, да вариантов нет. А под конкретную задачу была надежда обойтись малой кровью.

Исходник из последней ссылки коллеги kovigor очень даже и очень. Я пока разбираюсь с тем как автор проекта корректировал его под свои нужды.

Исходник изначально под 1024 точки. Таблица синусов осталась нетронутой, а проект под 64 точки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проект рабочий,использовался в составе программно-аппаратного спектроанализатора (и не только) на базе 80386 лет 20 назад ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, kovigor said:

Проект рабочий,использовался в составе программно-аппаратного спектроанализатора (и не только) на базе 80386 лет 20 назад ...

Честно говоря, используя Ваш с комментариями буду пробовать самообучаться. Т.е. разбирать как именно оно работает.

А под проектом из последней ссылки я имел в виду проект спектроанализатора. Который практически готов к употреблению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, kovigor said:

Можно и его взять за основу, почему нет ?

Он даже вполне себе работает. Вот огроменное спасибо!

Осталось разобраться как полученные значения привести к реальному масштабу.

Снимок.JPG

Изменено пользователем АндрейЦ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немножко ещё почитал. Правильно ли я понимаю, что полученные амплитуды промасштабированы относительно исходного сигнала на величину половины числа отсчётов.

Т.е. вот у меня есть выделяющаяся частота под номером 436 величиной 615. И если я её поделю на 1024/2 = 512, то получу что то порядка  1,2. И это будет амплитуда в масштабе входного сигнала. Т.е.  её амплитуда 1,2 МЗР АЦП?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужна только частота, а фаза - нет, то бессмысленно БПФ применять! Ведь для этого есть значительно более простые вещи. Те же дискретные косинусные...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 2/2/2022 at 11:28 PM, АндрейЦ said:

Нужно выделить частоту/гармонику с максимальной амплитудой. Провёл за гуглением несколько дней. Скажу честно, далёк я от самостоятельной реализации БПФ на основе просто алгоритмов и графов. Попробовал ДПФ, которое гораздо попроще, но скорость не просто не устраивает, а сильно не устраивает. Нашлась относительно простая реализация

а может линейное предсказание использовать? Если у вас структура шума такова, что кроме полезного сигнала в шуме нет функций, у которых их производные линейно зависимы от самих функций (синусы и косинусы как раз идеально подходят), то линейное предсказание обычно хорошо работает и его можно реализовать довольно просто. При наличии только одной самой яркой гармоники и линейного сдвига сигнала (он часто бывает в оцифрованных данных), все потребует 1024*3 арифметических операций в несколько строк + один раз искать корни методом Кардано или итерировать с матрицей 3х3. Если у вас больше одного "яркого" сигнала, то матрица будет чуть больше, но все будет почти также. По моим наблюдениям для примерно 1000 точек этот метод даже быстрее БПФ, если в сигнале не более 2-3 ярких гармоник надо найти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...