реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Спектральный анализ 44kHz stereo на STM32Fxxx..., Возможность и современный опыт сообщества?
jcxz
сообщение Feb 23 2017, 17:43
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(khach @ Feb 23 2017, 12:04) *
Как пример - SDR радио на кортексах (любительское). Конечно без особой оптимализации, но в эпоху STM32F4 пришлось использовать два процессора с межпроцессорным взаимодействием. И только с появлением STM32F7 все "утопталось" в один камень.

Странно... А у меня оно на M3 (одном!) на 78МГц вполне себе нормально работает. На LPC1788. И загрузка CPU всего 60-70%...
При этом и WiFi успевает обслуживать и на LCD рисовать и много чего другого.
ЧЯДНТ? rolleyes.gif
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Feb 24 2017, 09:04
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(jcxz @ Feb 23 2017, 19:43) *
Странно... А у меня оно на M3 (одном!) на 78МГц...

Заинтриговало, почему "кривая" частота 78MHz?
Go to the top of the page
 
+Quote Post
Allregia
сообщение Feb 24 2017, 09:23
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(khach @ Feb 23 2017, 11:04) *
Спектроанализатор, блютус, USB, I2S на одном камне в риалтайме? Не верю (с). Как пример - SDR радио на кортексах (любительское). Конечно без особой оптимализации, но в эпоху STM32F4 пришлось использовать два процессора с межпроцессорным взаимодействием.


Ну может, только из-за спектроанализатора, потому что все остальное прекрасно работало на 100MHz LPC1768, который М3, причем на 96/24.

А на М4, с FPU/DSP, на 200Мгц F4, да на 44/16 - вполне и простенький спектроанализатор должен влезьть.
Во всяком случае, DDS генератор, где синус считается в риалтайме, работает на 168МГу F407 даже на 384/32.
Go to the top of the page
 
+Quote Post
khach
сообщение Feb 24 2017, 10:40
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741



Проблемы были не со скоростью а с памятью- буфера под ФФТ, буфера под USB, буфера под аудиопоток, копия экрана для быстрой перерисовки. И если в F407 это уже можно было как то запихать, то в F103 не лезло. Тут еще вопрос- по задаче требуется полный риалтайм или нет, потому что полный риалтайм- это двойное буферирование аудиопотока. Хотя выше по теме я немного недопонял что I2S и БТ это то же самое в данном приложении, думал что это два разных потока, например вход и выход аудио.
С экраном тоже все сильно зависило от подключения- через SPI перерисовать графику сложновато было в риалтайме, только появление FSMC решило проблему. Вот только контроллер LCD на FSMC часто дрался с внешней статической памятью, которую можно было бы использовать под буфера, но не получалось. Только появление DRAM у F7 решило эту проблему, хотя обновление экрана из этой же памяти бывает вызывает странные глюки при работе периферии с DMA в буфера во внешней памяти. Тут еще болезнь развития накладывается- ту задачу, которую можно запихать сейчас в камень, зная его все особенности и глюки, не получалось запихать когда процессор только появился на рынке и его только осваивали.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Feb 24 2017, 11:04
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Выводить спектроанализатор - не кино смотреть (и не в игры играть), 10фпс более чем достаточно, и буфер экрана не обязательно в памяти держать.

Буфера USB и аудиопотока, как я гооворил, прекрасно вмещались в LPC1768, у которого памяти куда меньше чем у F4, внешняя память не использовалась.
Спектроанализатор тут-же не измерительный, а больше индикаторный, ФФТ на 8К точек дает около 5гц разщрешения по частоте на 44.1, а это в F4 тоже без внешней памяти влезет.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 24 2017, 15:28
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(KnightIgor @ Feb 24 2017, 11:04) *
Заинтриговало, почему "кривая" частота 78MHz?

У меня там была SDRAM, а у этого МК максимальная частота работы внешней шины SDRAM ==80МГц. И эта частота получается из частоты ядра делённой на 1 или 2.
Так что если частота ядра >80МГц, то делитель получался ==2 и общая скорость работы резко падала (SDRAM интенсивно использовалась, а при отладке и код из неё выполнялся).
Конечно при дальнейшем увеличении частоты ядра до 120МГц, низкая скорость шины (до 60МГц) компенсировалась частотой ядра, но такая частота ядра уже была излишняя, так как и на 78 всё работает с большим запасом (до 30%).
А почему не 80, а 78 - уже точно не помню, по быстродействию это примерно то же самое.
Скорей всего хотел чтобы частоты периферии некратные получались (для удобства отладки), а периферии там много использовалось разной.
Или по скорости UART ошибка меньше получалась (там среди прочих использовались большие baudrate на UART-ах).
Точно уже не помню, да и без разницы - по быстродействию обработки это примерно то же самое.

Цитата(khach @ Feb 24 2017, 12:40) *
С экраном тоже все сильно зависило от подключения- через SPI перерисовать графику сложновато было в риалтайме, только появление FSMC решило проблему.

И LCD у меня в том проекте был подключен как раз по SPI.
А какая разница? Естественно не нужно рисовать напрямую в видеопамяти LCD (если таковая есть). Я рисовал в памяти МК, а готовую картинку - по SPI+DMA -> LCD.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Feb 27 2017, 13:25
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(KnightIgor @ Feb 22 2017, 18:49) *

Привет всем, again.

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

1. Пока остановился на "белых" клавишах малой, первой и второй октав. Всего 21 нота/частота. Частоты получаются:
131,147,165,175,196,220,247,262,294,330,349,392,440,494,523,587,659,698,784,880,
988

2. Применяю Гёрцеля. Описано, например, здесь, с кусками кода. Коэффициенты для каждой частоты посчитаны в Excel и занесены константами в код. Таким образом, синусы и косинусы не вызываются.

3. Предварительно исходный поток стерео с 44.1kHz 16-ти битных выборок я прореживаю до 2205Hz частоты стерео выборок. Для этого DMA просто складывает поток из I2S по кольцу в двойной буфер размером на 20 стереовыборок на каждый буфер, в результате прерывания от DMA (HT/TC) идут c требуемой частотой в 2205Hz. По этим прерываниям происходит усреднение всех 20-ти стереовыборок соответствующего буфера и запись результата в накопительный двойной буфер для Гёрцеля размером 222 выборки каждый. На такую операцию (прерывание) уходит про всё 10мкс. Перед записью идет масштабирование из 16-бит в диапазон [0..100]. Почему? Изначально я сделал так исходя из кода примера (там генегируются тестовые последовательности в диапазоне амплитуд [0..100]). Когда же вернулся к полному диапазону, "узнаваемость" нот ухудшилась.

4. Эти 222 выборки произошли от желания получить разрешение в 10Hz (2205/10=221) с округлением вверх до четного числа (с нечетным 221 получались странные результаты, не стал углубляться).

5. После примерно 100мс один из буферов Гёрцеля заполняется, и происходит запуск поиска указаных частот по этому буферу. Поиск ведется из синхронного цикла (система типа round robin условно многозадачная, кооперативная и синхронная, похожа на protothreads) и разделен на этапы с поиском одной частоты из 21 за этап. Общее время обработки буфера - примерно 35мс, то есть треть от времени заполнения буфера. Результат - массив значений амплитуд для всех 21 нот. Это на STM32F103 на 72MHz, загрузка побочная небольшая.

6. Для выделения доминирующего тона происходит усреднение амплитуд для каждой ноты из трех октав (мне нужно знать имя ноты, а не точно, какой октаве она принадлежит), то есть, усреднение трех гармоник каждой ноты, после чего находится максимум из 7-ми значений.

Чистые ноты (эмуляция пианино на смартфоне) распознаются достаточно хорошо.

Пока так. Займусь FFT для сравнения.

P.S. Нашел ошибочку, после чего масштабирование в [0..100] убрал, все распознается хорошо. Время поиска сократилось с 35мс до 20мс. Не любит процессор байтные диапазоны и операции.

P.P.S. Заметочка на полях: если I2S запрограммирован на вход (приём) как ведомый (slave), а I2S сигналы на входе CPU уже активны (внешний источник рубает вовсю), то разрешение I2S интерфейса следует засинхронизировать к сигналу LRCK (WS в терминах документации на STM32F), а именно разрешать I2S, пока LRCK = 1, то есть - ДО ниспадающего фронта на нем. Иначе происходит нарушение битовой синхронизации, и прием данных идет со сдвигом. Самый тупой метод синхронизации перед установкой бита I2SE - синхронное ожидание перепада LRCK с 0 в 1.

Сообщение отредактировал KnightIgor - Feb 28 2017, 11:40
Go to the top of the page
 
+Quote Post
romas2010
сообщение Feb 28 2017, 17:43
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515



Цитата(KnightIgor @ Feb 27 2017, 16:25) *
Привет всем, again.

1. Пока остановился на "белых" клавишах малой, первой и второй октав. Всего 21 нота/частота. Частоты получаются:
131,147,165,175,196,220,247,262,294,330,349,392,440,494,523,587,659,698,784,880,
988

..........
Пока так. Займусь FFT для сравнения.



Я бы рискнул все-таки через БПФ, но при этом
1) 4096 выборок, соответственно дискрета по частоте 44100/4096 ~=11 Гц ОЗУ надо 32к (4096*(float Re+float Im))
2) Табличный синус, а косинус-это синус,сдвинутый на pi/2, то есть на cos[x]=sin[x+1024]
3) бабочки БПФ написать на ассемблере с командами сопроцессора
4) DMA I2S не использовать,а вычитывать в каждом прерывании I2S выборку и сразу же кинуть в буфер отсчётов БПФ с бит-реверсией адреса(есть у М4 __rbit() intrinsic)+ экономия ОЗУ

Хотя возникает вопрос- а какже на контроктаве и субконтроктаве, там дельта частот очень маленькая?




Go to the top of the page
 
+Quote Post
Obam
сообщение Feb 28 2017, 18:34
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Нету у ТС пока "сопра"...


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Feb 28 2017, 19:50
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(romas2010 @ Feb 28 2017, 19:43) *
Я бы рискнул все-таки через БПФ, но при этом
1) 4096 выборок, соответственно дискрета по частоте 44100/4096 ~=11 Гц ОЗУ надо 32к (4096*(float Re+float Im))
2) Табличный синус, а косинус-это синус,сдвинутый на pi/2, то есть на cos[x]=sin[x+1024]
3) бабочки БПФ написать на ассемблере с командами сопроцессора
4) DMA I2S не использовать,а вычитывать в каждом прерывании I2S выборку и сразу же кинуть в буфер отсчётов БПФ с бит-реверсией адреса(есть у М4 __rbit() intrinsic)+ экономия ОЗУ

Хотя возникает вопрос- а какже на контроктаве и субконтроктаве, там дельта частот очень маленькая?

1). Не слабо так, 32К. На моем F103 - всего 48K. Ну, должно хватить, т.к. другие задачи не прожорливые.
2). Это реально.
3). Нету сопроцессора. Разбаловались тут все на F4xx....
4). I2S прерывания идут в 2*44.1K, т.к. сигнал - стерео. Это каждые 12мкс. Проц зашьется. Говорить об экономии ОЗУ здесь, выделив сразу 32К в пункте 1)., есть несколько непоследовательно wink.gif .
5). Да, уже в малой октаве между ми и фа - 9.8Hz, а глубже - меньше.

Что имеется ввиду под бит-реверсией адреса?
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Feb 28 2017, 20:43
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(KnightIgor @ Feb 28 2017, 14:50) *
Что имеется ввиду под бит-реверсией адреса?

Это для FFT:

http://www.dspguide.com/ch12/2.htm


--------------------
ASB
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th August 2025 - 22:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016