2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|
1 | |
БПФ для STM32F10317.07.2015, 09:12. Показов 23308. Ответов 40
Метки нет (Все метки)
Здравствуйте, помогите подцепить БПФ на stm32. Есть некая библиотека DSP, не могу с ней разобраться. Можно ли просто функцию на C запихнуть? Я пробую, у меня почему-то не выходит. На компьютере выводит, а МК зависает. Код брал с https://ru.wikibooks.org/wiki/%D0%A0%D0 ... 1%8C%D0%B5. Может подскажете код, на C/С++, который точно заведется на МК? (с ассемблером я не дружу). Ну или скажите как этот DSP включить.
Делаю гитарный тюнер (в виде частотометра). Хотелось бы хотя бы 1024 отсчета. АЦП работает. Выводит результат на 7-сегментный индикатор. На индикаторе будет частота, до десятой, поэтому точка. Помогите пожалуйста.
0
|
17.07.2015, 09:12 | |
Ответы с готовыми решениями:
40
STM32F103:производительность 32бит БПФ выше, чем 16-битного? Возможно ли преобразование в стиле БПФ для нелинейных чирпов Как разбить одно БПФ на несколько БПФ? БПФ для аудио |
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|||||||||||
18.07.2015, 17:40 [ТС] | 3 | ||||||||||
raxp Спасибо за наводку. У меня возник вопрос testIndex это индекс максимального значения в массиве или что? Просто мне нужно узнать где максимум.
В принципе где-то так (из 1024). Но какая частота дескеретизации? Как найти максимум? Добавлено через 2 минуты Там для пробы дается массив 10кГц с шумом. Добавлено через 19 минут И какая функция мне нужна из библиотеки DSP. Я так понимаю, у меня три варианта arm_rfft_q15, arm_rfft_q31, arm_rfft_f32. Где-то прочитал что от них зависит кол-во знаков после запятой. Получается что для меня это не важно, ведь АЦП выдает результат от 0 до 4095. т.е. целые числа. Добавлено через 8 минут Еще кое-что, по идее мне нужен DMA, чтобы получается АЦП забил допустим массив 2048 отсчетов, а потом произошло прерывание, так? Можно я буду выкладывать сюда все свои глупые вопросы и рассуждения, помогите мне закончить "проект".
0
|
raxp
|
18.07.2015, 21:39
#4
|
Не по теме: ...STM это не ко мне, мы FFT на FPGA аппаратно реализуем, сразу на ПЧ.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
18.07.2015, 22:16 | 5 |
что за библиотека?
я пользовался вот этой три файла, три функции, на выборку 64 256 и 1024 написаны на асме, посему достаточно шустрые да возьми прерывания для DMA поищи, в сети много примеров какую задашь такая и будет, прицепи АЦП к таймеру
0
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|
18.07.2015, 23:26 [ТС] | 7 |
не, 10кГц это я про пример из arm_fft_bin_example. Там готовый массив на 10кГц, хотел найти эти 10кГц в спектре.
Да 1024 точек не то. Давайте пересчитаем. Вот что я думаю: 1) Частота дискретизации Fs = 2048 Гц. 2) Значит период дескретизации Ts = 1/Fs = 1/2048 c. 3) Количество отсчетов N = 2048 4) Значит выборка будет происходить за время t = N/Ts = 1 c. 5) Шаг частот будет f = 1/(N*Ts) = 1 Гц 6) Забиваю отсчеты нулями допустим по одному нулю. тогда отсчетов уже будет 4096 и шаг частот пол герца. Метод забивания выборки нулями работает, результат не искажается проверял сто раз на компьютере. А еще можно было бы тремя нулями забить тогда отсчетов 8192 и шаг 0,25 Гц. Знаю что это бутафория какая-то, ну да ладно, какая разница. Для настройки гитары даже думаю погрешность в 2 герца вообще не заметна (ну на первой-второй струне точно). Вопрос становится в другом будет ли МК рассчитывать для стольких точек. ValeryS Попробую подключить ваш файл. Поможете если что, а то я только недавно начал с stm32 знакомиться. И пусть будет 1024 отсчета и частота дескретизации 1024 Гц и шаг 1 Гц без точки вообщем, мне уже все равно, хоть что-то бы работало.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
19.07.2015, 00:20 | 8 |
значит максимальная измеряемая частота 1024 Гц
тут есть несколько путей один из них,чисто теоретический,на практике не применял это делать три замера одновременно у STMок три АЦПухи, правда не у всех одна допустим работает на частоте 1 кГц, ловит низкие,там как раз десятки нужны вторая на 10 кГц,третья на 100, частоты можно поварьировать второй сделать генератор качающейся частоты, и его сигнал умножать на входной сигнал, при совпадении частот амплитуда резко возрастет, потом на выпрямитель и замерять постоянную составляющую, обычным АЦП, без преобразований этакое аппаратное преобразование Фурье он не мой тоже где то скачал там есть одна особенность функции работают с 32 битными массивами, так вот старшие 16 бит это мнимая составляющая комплексного числа, а младшие 16 это действительная часть если у тебя это единичное производство , то советовал бы посмотреть в сторону STM32F4.... Во первых там частота выше до 168 мГц, во вторых на борту стоит модуль который может работать с числами с плавающей запятой цена конечно на камни больше чем 103 серия, 500руб и выше Добавлено через 4 минуты ты здесь получишь еще одну бяку затухание колебаний тоже будут учитываться палка о двух концах, чем больше замеров, тем больше время измерения,но выше селективность чем меньше замеров тем меньше измерение,ниже селективность если бы это была не струна, а допустим генератор то можно было бы грубо оценить частоту, потом подогнать дескритизацию и точно замерять но затухание все портит
0
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|
19.07.2015, 10:13 [ТС] | 9 |
Я не понял идею. Вот 6 струн, и пусть три АЦП у каждого разная ЧД. И как дальше?
1-ая 329,63 Гц // Здесь мерит первый АЦП 2-ая 246,94 Гц // ЧД допустим 1024 Гц 3-ая 196,00 Гц // второй 4-ая 146,83 Гц // ЧД 512Гц 5-ая 110,00 Гц //третий 6-ая 82,41 Гц // 256 Гц У каждого разное число отсчетов. Я не понимаю... Я так Частота улетает и особенно быстро на басовых струнах. Но я думаю в спектре все равно основная частота доминирует. Буду почаще струну дергать
0
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
||||||||||||||||
19.07.2015, 16:22 [ТС] | 11 | |||||||||||||||
ValeryS Спасибо понял.
Помоги, что за предупреждение? warning: #223-D: function "cr4_fft_1024_stm32" declared implicitly Добавлено через 1 час 49 минут Сделал заголовочный файл с такой строчкой
Добавлено через 3 минуты
Добавлено через 55 минут Неправильно написал:
Добавлено через 52 минуты Хотя нет она работает, только показывает какую-то фигню, до 512 она неубывает, а потом она все ноль и ноль. В конце она снова возрастает что-ли. бред какой-то
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
20.07.2015, 08:18 | 12 |
указанная функция нигде не определена.
ЗЫ: вообще, в ветке была уже подобная тема - там человек писал программку по определению частот нескольких струн и боролся за как можно короткий промежуток времени определения. Но сейчас я найти ее не могу.. Если кто-то наткнется или помнит - скиньте ссыль, я бы объединил темы.
0
|
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
|
|
20.07.2015, 08:30 | 13 |
1
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|
20.07.2015, 11:42 [ТС] | 14 |
Можно пока ничего не переносить. Я хочу прийти к готовому проекту в этой теме.
0
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|||||||||||
23.07.2015, 14:31 [ТС] | 15 | ||||||||||
На данный момент получилось подключить из библиотеки CMSIS-DSP пример "arm_fft_bin_example".
Работает хорошо и правильно. Файл на ассемблере работает тоже, но выводит неправильные результаты, не знаю почему. Теперь буду пробовать работать без мнимой части, используя "Real FFT Functions" Добавлено через 6 часов 48 минут Кто нибудь знает, почему мой выводимый результат оказывается в 2 раза меньше?
Добавлено через 11 минут При умножении сигнала на окно Хэмминга, спектр становится ближе к истине, но погрешность все-равно есть. Наверно идеально точного результата все равно не добиться никак. Ладно попробую теперь цеплять DMA. И еще про забивку сигнала нулями сейчас напишу... Добавлено через 12 часов 32 минуты ValeryS, а как при умножении я буду иметь скачок амплитуды? Я понял что большой точности с БПФ мне не добиться никак, но до ± 10 Гц я точно подстрою. А что если потом использовать другой режим, с ГКЧ. Т.е. допустим я подстраиваю третью струну 196,00 Гц. Сперва использую БПФ, настраиваю примерно до этого уровня. Дальше ГКЧ. Пусть на нем частота гуляет от 186 до 206 Гц. Как-бы два промежутка: (186-...-196-...-206) если скачок амплитуды будет в первом промежутке (186-..частота струны..-196) значит нужно подтянуть струну. Вот только я не знаю, можно ли сделать ГКЧ на самом микроконтроллере, например через ШИМ, было бы удобно. И потом мне нужен умножитель. Почитал что есть аналоговый умножитель. Но будет ли всплеск амплитуды, если синус умножается на синус, получается синус квадрат, который мало чем отличается от синуса обычного. Расскажите мне правильно ли я рассуждаю, и как это должно выглядеть в теории? Получу ли я большую точность? Добавлено через 4 часа 7 минут Ну да Генератор такой сделать на МК вроде можно, только на выход нужно будет наверно конденсаторов влепить. А вот про умножение я не найду информации. Мне не понятно как там с фазой будет обстоять дело, если в какой-то момент частота частота генератора совпадет с частотой струны, а она окажется в противофазе то что... Если кто знает подскажите. или может какая литература есть. И почему на мои вопросы никто не отвечает
0
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
||||||
24.07.2015, 21:28 [ТС] | 16 | |||||
Что-то я все не пойму как с этим DMA работать.
Вот код
Добавлено через 4 минуты И мне нужно прерывание по заполнению массива. Так можно?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
25.07.2015, 11:18 | 17 |
А ничего
увеличится амплитуда и появится постоянная составляющая смотри sin(a)*sin(a)=sin2(a) -sin(a)*sin(a)=-sin2(a) все тоже самое, только знак поменялся еще раз порекомендую "Руководство программиста по работе со звуком" Кинтцель Тим http://www.books.ru/books/ruko... ukom-8612/ очень наглядно расписан принцип Фурье, есть еще глава про цифровые фильтры, может они лучше подойдут с Ассемблерными файлами разобрался? нужно их подключить в проект Могу скинуть свой проект в Keil, но это не рабочий проект, а так помойка, пробовал всякие подходы и в результате там черт ногу сломит Добавлено через 1 минуту можно смотри в сторону DMA прерывание есть по заполнению массива и по заполнению половины массива, удобно для кольцевых буферов
0
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|
25.07.2015, 12:16 [ТС] | 18 |
Амплитуда же не увеличивается, максимум 1.
Нет, почему-то выходной массив y[N] не тот. Пик я там видел (прогонкой по индексам), но был он совсем не там, где нужно. В итоге подключил эту библиотеку http://www.keil.com/pack/doc/C... index.html работает. Но ассемблерный файл я еще помучаю, только не сейчас. Я уже писал, но повторюсь. до меня дошло, что большой точности я не добьюсь никак. Вот даже идеальную функцию синуса с частотой 300 герц забиваю в массив, а на выходе 302,7. А с АЦП результат конечно же будет еще хуже. Так вот, пришла идея, (оцените ): 1) Примерно подтянуть струну до нужной частоты с помощью БПФ. 2) Второй режим: создаю на ШИМ идеальную синусоиду с частотой струны, которая должна быть. 3) Сигнал с ШИМа и звук с гитары подаю на смеситель. 4) На выход смесителя ставлю ФНЧ 5) Считаю частоту биений. Ну как?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
25.07.2015, 12:57 | 19 |
для этого есть, у 103, -DAC
можешь получить чистую синусоиду,без шим ну или почти чистую,ступеньки от дескритизации все равно будут но например на 720 итерациях, я их на осциллографе не наблюдал Добавлено через 2 минуты это если единичная амплитуда в реальности же если меньше 1 уменьшится,1 останется, больше 1 увеличится но самое главное, появится постоянная составляющая, рисунок будет как у двухполупериодного выпрямителя
0
|
2 / 2 / 3
Регистрация: 03.05.2015
Сообщений: 63
|
|
25.07.2015, 13:10 [ТС] | 20 |
А ну да, если 2sin(a)*3sin(a), то 6. понял
а если сдвиг фаз 90. то что? 2sin(a+90)*3sin(a) = 0, если sin(a)=1.
0
|
25.07.2015, 13:10 | |
25.07.2015, 13:10 | |
Помогаю со студенческими работами здесь
20
БПФ для перемножения полиномов БПФ для датчика звука Входные данные для БПФ Алгоритм Рейдера для БПФ БПФ для прямоугольного и треугольного импульсов БПФ для нахождение коэффициентов Фурье БПФ реализация для любого количества точек Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |