АндрейЦ 0 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Есть задача: микроконтроллер (PIC32MM) складывает в массив на 1024 отсчёта оцифрованный некий входной сигнал. Нужно выделить частоту/гармонику с максимальной амплитудой. Провёл за гуглением несколько дней. Скажу честно, далёк я от самостоятельной реализации БПФ на основе просто алгоритмов и графов. Попробовал ДПФ, которое гораздо попроще, но скорость не просто не устраивает, а сильно не устраивает. Нашлась относительно простая реализация https://www.silabs.com/documents/public/application-notes/an142.pdf Которую в данный момент изучаю. Но очень она громоздкая. Может кто подскажет более компактную реализацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Алгоритм Гертцеля ? А в АОНах 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АндрейЦ 0 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Частота заранее неизвестна. Собственно нужно в произвольном сигнале найти "палку" максимальной амплитуды и определить частоту. По порядковому номеру, как я понимаю. ПыСы пасиб, изучу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Тогда БПФ. Вот, из того же архива. Посмотрите, может помочь: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба 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" не скажу. В виду отсутствия оного у меня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Тут одна тонкость. До тех пор, пока человек не поймет, как работает ДПФ, все эти готовые реализации скорее вредны, чем полезны ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АндрейЦ 0 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Как работает ДПФ я можно сказать почти понимаю. По крайней мере улавливаю физический смысл. Меня в ужас приводят свёртки - бабочки БПФ. Если бы это было делом всей моей жизни, да вариантов нет. А под конкретную задачу была надежда обойтись малой кровью. Исходник из последней ссылки коллеги kovigor очень даже и очень. Я пока разбираюсь с тем как автор проекта корректировал его под свои нужды. Исходник изначально под 1024 точки. Таблица синусов осталась нетронутой, а проект под 64 точки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Проект рабочий,использовался в составе программно-аппаратного спектроанализатора (и не только) на базе 80386 лет 20 назад ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АндрейЦ 0 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба 4 minutes ago, kovigor said: Проект рабочий,использовался в составе программно-аппаратного спектроанализатора (и не только) на базе 80386 лет 20 назад ... Честно говоря, используя Ваш с комментариями буду пробовать самообучаться. Т.е. разбирать как именно оно работает. А под проектом из последней ссылки я имел в виду проект спектроанализатора. Который практически готов к употреблению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Можно и его взять за основу, почему нет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АндрейЦ 0 3 февраля, 2022 Опубликовано 3 февраля, 2022 (изменено) · Жалоба 56 minutes ago, kovigor said: Можно и его взять за основу, почему нет ? Он даже вполне себе работает. Вот огроменное спасибо! Осталось разобраться как полученные значения привести к реальному масштабу. Изменено 3 февраля, 2022 пользователем АндрейЦ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Получилось ? Ну вот и хорошо :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АндрейЦ 0 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Немножко ещё почитал. Правильно ли я понимаю, что полученные амплитуды промасштабированы относительно исходного сигнала на величину половины числа отсчётов. Т.е. вот у меня есть выделяющаяся частота под номером 436 величиной 615. И если я её поделю на 1024/2 = 512, то получу что то порядка 1,2. И это будет амплитуда в масштабе входного сигнала. Т.е. её амплитуда 1,2 МЗР АЦП? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Если нужна только частота, а фаза - нет, то бессмысленно БПФ применять! Ведь для этого есть значительно более простые вещи. Те же дискретные косинусные... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 18 12 февраля, 2022 Опубликовано 12 февраля, 2022 · Жалоба On 2/2/2022 at 11:28 PM, АндрейЦ said: Нужно выделить частоту/гармонику с максимальной амплитудой. Провёл за гуглением несколько дней. Скажу честно, далёк я от самостоятельной реализации БПФ на основе просто алгоритмов и графов. Попробовал ДПФ, которое гораздо попроще, но скорость не просто не устраивает, а сильно не устраивает. Нашлась относительно простая реализация а может линейное предсказание использовать? Если у вас структура шума такова, что кроме полезного сигнала в шуме нет функций, у которых их производные линейно зависимы от самих функций (синусы и косинусы как раз идеально подходят), то линейное предсказание обычно хорошо работает и его можно реализовать довольно просто. При наличии только одной самой яркой гармоники и линейного сдвига сигнала (он часто бывает в оцифрованных данных), все потребует 1024*3 арифметических операций в несколько строк + один раз искать корни методом Кардано или итерировать с матрицей 3х3. Если у вас больше одного "яркого" сигнала, то матрица будет чуть больше, но все будет почти также. По моим наблюдениям для примерно 1000 точек этот метод даже быстрее БПФ, если в сигнале не более 2-3 ярких гармоник надо найти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться