FFT на Си для AVR

Обсуждаем контроллеры компании Atmel.
S@neK
Родился
Сообщения: 11
Зарегистрирован: Чт сен 19, 2013 19:52:13

Re: FFT на Си для AVR

Сообщение S@neK »

Извеняюсь за выход из темы, но мне неккому обратиться :
Нагуглил интересную статью http://www.enlight.ru/demo/faq/smth.pht ... nd_filters Начал пытаться реализовать, да вот в чем загвостка; по расчетам мне нужен масив из 200 замеро на частоте АЦП 62,500к кГц. Но как АЦП настроить? По прирываниям, или это можно без таймеров организовать? Если несложно, помогите!!! Пишу в кодевиженавр. Как настроить замеры на частоте АЦП?
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

Re: FFT на Си для AVR

Сообщение uni »

AVR'ка (mega) может только до 15 кГц оцифровывать. У вас внешнее АЦП?
Россия навсегда!
S@neK
Родился
Сообщения: 11
Зарегистрирован: Чт сен 19, 2013 19:52:13

Re: FFT на Си для AVR

Сообщение S@neK »

Нет. В кодевижене, в кодевизарде при кварце 8МГц минимальная частота 62,500 кГц, я так понял- єто частота дискретизацыи?
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

Re: FFT на Си для AVR

Сообщение uni »

Частота дискретизации - скорость, с которой мы получаем отсчёты. Так вот, если нам нужны полные 10 бит от АЦП, то частота его тактирования должна быть в районе 50 - 200 кГц. При этом на одно преобразование тратится около 13 тактов, итого: 200 кГц / 13 ~= 15 k[S]amples[P]er[S]econd, т.е. 15 000 отсчётов с разрешением 10 бит в секунду - вот это и есть частота дискретизации. Можно её увеличить, но тогда это уже будет не 10-битное АЦП.
Россия навсегда!
S@neK
Родился
Сообщения: 11
Зарегистрирован: Чт сен 19, 2013 19:52:13

Re: FFT на Си для AVR

Сообщение S@neK »

Спасибо, понятно стало!Но как заносить измерения беспрерывно в массив? как я понял это можно сделать прерываниями АЦП но как и где это писать для кодевижена, приведите пожалуйста пример!
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

Re: FFT на Си для AVR

Сообщение uni »

А чем вам результат работы Wizard'а в CodeVision не пример? Там же вроде формируется почти готовый шаблон. Возьмите документацию на мк, покумекайте над настройками этого формирователя исходников, сгенерируйте что-нить, запустите в симуляторе, посмотрите как работает. Если не работает как надо, то заливайте код проекта сюда, народ посмотрит, подскажет. Я не большой спец по CodeVision, поэтому не могу тут помочь сильно. Наверняка найдётся кто-нибудь кто подскажет.
Россия навсегда!
S@neK
Родился
Сообщения: 11
Зарегистрирован: Чт сен 19, 2013 19:52:13

Re: FFT на Си для AVR

Сообщение S@neK »

Да вроде настроил, но где и как писать прерывания? У меня необходимость заносить данные в 200-от значный масив по прерывания АЦП. Данные зваковой частоты на 0 вход, на остальные 3 напряжение потенцыометров(их можна заносить в дну переменную, оновляя её).


Вроде настроиный, но где и как написать прерывания чтобы Данные 0-ого порта заносились последовательно в масив, по кругу?
Вложения
Фильтр.rar
(25.66 КБ) 214 скачиваний
S@neK
Родился
Сообщения: 11
Зарегистрирован: Чт сен 19, 2013 19:52:13

Re: FFT на Си для AVR

Сообщение S@neK »

Версия 1.1. Вроде считываю значение звуковой амплитуды с нулевого входа, а остальные 3 -с регуляторов, они просто обновляються.
далее нахожу среднее арифмитическое значений и записую в переменную Ф. (значение звуковой амплитуды с нулевого входа это отличие действительного значения от средины питания. ПРОВЕРЬТЕ ПЛИЗ!!! (Данная прога нужна для фильтра усреднением)
Вложения
Фильтр 1.1.rar
(32.36 КБ) 205 скачиваний
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: FFT на Си для AVR

Сообщение ELcat »

Приветствую всех!
Не подскажете, есть ли какой-нибудь готовый алгоритм нахождения амплитуд шестнадцати заданных частот в сигнале? Частота сэмплирования 8кГц, длина 40мс (320 выборок), частоты: 697, 770, 852, 941, 1209, 1336, 1477, 1633Гц и их удвоенные значения. Желательно на Си для AVR.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: FFT на Си для AVR

Сообщение YS »

Не подскажете, есть ли какой-нибудь готовый алгоритм нахождения амплитуд шестнадцати заданных частот в сигнале?


Есть. Алгоритм Гёрцеля.

https://ru.wikipedia.org/wiki/Алгоритм_Гёрцеля
http://www.embedded.com/design/configur ... -Algorithm
http://www.ti.com/lit/an/spra066/spra066.pdf
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: FFT на Си для AVR

Сообщение ELcat »

Не подскажете, какой алгоритм реализован в телефонах РУСЬ? У них ведь в схеме нет ни аппаратного декодера DTMF, ни даже АЦП. "Оцифровка" сигнала тлф.линии производится при помощи компаратора, а вычисления в микроконтроллере типа 80C31/80C51. Тем не менее они декодируют DTMF пакеты АОН и сигналы дистанционного управления функциями телефона.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: FFT на Си для AVR

Сообщение YS »

какой алгоритм реализован в телефонах РУСЬ?


Я никогда в жизни не видел этого самого телефона, но гугление показало, что там до версии "Русь 28 Соната" применяется, цитирую, вычисление корреляции с функциями Радемахера.

Почитать про это можно тут.

UPD: Статья, ссылка на которую есть в материале по второй ссылке, судя по всему более недоступна. Почитать ее можно благодаря Wayback Machine. Вкратце - компаратор есть однобитный АЦП, и этого достаточно для определения частот DTMF корреляционным методом. :shock:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: FFT на Си для AVR

Сообщение ELcat »

Спасибо большое, это уже хоть что-то.
Если честно, думал там всё намного проще, считаются промежутки между фронтами, с чем-то сравниваются и получается результат.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: FFT на Си для AVR

Сообщение YS »

Ну, промежутки вряд ли чего дадут. Все же это изначально спектральный метод кодирования, так что тут все полюбому будет упираться в корреляционный/спектральный анализ в том или ином виде.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
INA
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Пн мар 23, 2015 17:18:47

Re: FFT на Си для AVR

Сообщение INA »

Доброго времени, многоуважаемое сообщество!

Очень рад присоединиться к вам!

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

У меня есть некий массив, считанных с АЦП значений (допустим это массив, длиной в 64 значения),
с частотой дискретизации 19200 Гц. Данные эти 10-ти битные (обычный АЦП АТМеги).
Теперь мне нужно определить в этом 64-х битном отсчёте амплитуду некой частоты (к примеру 1000Гц).
Прочёл по этому поводу уже очень много... Голова опухла....
Видел в интернете много всевозможных цветомузык и спектроанализаторов, включая исходники.
Многие из них использовали готовые библиотеки и таблицы синусов/косинусов для вычислений...
Тут я совсем заблудился...

Так что же мне делать с этим 64-х битным отсчётом, чтобы получить значение амплитуды нужной частоты?
Искать таблицы синусов/косинусов для частоты 1000Гц?
Тогда получается, что для получения значений амплитуд 10 частот нужно искать (или вычислять с помощью сторонних программ)
значения син/кос для всех 10-ит частот?
Так это 20 таблиц!... :o

Или что нужно делать-то?

Понять хочу, как эту высокую материю, как БПФ применить для конкретной задачи.
Саму последовательность понять хочу... Не в коде дело - код напишу сам, проверю и отлажу...
Но принцип сам...
В голове всё раскидано отдельными кусками - БПФ... таблицы син/кос... массивы с отсчётами...
Что с этим делать - не пойму...
Не судите строго - мне уже не 20 лет (и даже не 40)...
Может быть потому и не схватываю всё так быстро... Да и БПФ никогда не занимался...
Будьте любезны рассказать всё по порядку - буду безмерно благодарен!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: FFT на Си для AVR

Сообщение YS »

Очень рад присоединиться к вам!


Рады вас приветствовать! :) Будьте как дома. :beer:

Данные эти 10-ти битные (обычный АЦП АТМеги).


Чтобы получить более-менее честные 10 бит от АЦП атмеги, надо очень постараться. В последних двух битах в основном шум, если не принимать особых мер (грамотная трассировка, фильтрация AREF, и т.д.). Так что можете смело ставить бит ADLAR и использовать только старшие восемь бит.

Теперь мне нужно определить в этом 64-х битном отсчёте амплитуду некой частоты (к примеру 1000Гц).


Для этого не нужно БПФ. Достаточно алгоритма Гёрцеля [1] [2]. Единственно только, сам по себе он, разумеется, рассчитан на вычисления с плавающей точкой, так что в случае AVR придется немного заморочиться над переделкой его на фиксированную точку. Но там основная формула достаточно простая, так что особых сложностей быть не должно.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
INA
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Пн мар 23, 2015 17:18:47

Re: FFT на Си для AVR

Сообщение INA »

Спасибо большое за доброе приветствие и тёплые слова!

Да, по ходу всех моих путешествий по интернету я встречал ссылки на алгоритм Гёрцеля...
Так же понимаю, что для каждой конкретной задачи подобного типа обычно выбирают алгоритм, который будет необходимым и достаточным для решения данной конкретной задачи.
Но мне хотелось бы понять как при помощи именно БПФ решить эту задачу?
Просто я задал совсем простой вопрос о вычислении амплитуды конкретной частоты в спектре...
Как быть, если понадобиться собрать (пусть примитивный) анализатор спектра, скажем в диапазоне 1-5000 Гц?
Поэтому очень хочется понять, как в этом случае будет выглядеть алгоритм обработки вышеуказанного массива?

Можно ли этот массив изначально пропустить через БПФ, а после определить значение амплитуды какой из частот я хочу увидеть?
Уже прочёл книгу Ю. Сато по этому поводу...
Мозги, конечно накренились... Но, надеюсь не до конца... :)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: FFT на Си для AVR

Сообщение YS »

Но мне хотелось бы понять как при помощи именно БПФ решить эту задачу?


Сделать БПФ сигнала, после чего вычислить амплитуду интересующей гармоники как корень квадратный из суммы квадратов ее комплексных составляющих.

Можно ли этот массив изначально пропустить через БПФ, а после определить значение амплитуды какой из частот я хочу увидеть?


В результате БПФ вы получаете относительные амплитуды (точнее - разложение на комплексные составляющие, то есть фаза тоже учитывается) всех рассматриваемых гармоник. Выбирайте нужную и анализируйте...

Дискретное преобразование Фурье в сущности есть вычисление скалярных произведений сигнала с каждой из функций из определенного набора. То есть для каждой базовой функции из набора мы определяем, сколько ее есть в рассматриваемом сигнале.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
INA
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Пн мар 23, 2015 17:18:47

Re: FFT на Си для AVR

Сообщение INA »

YS писал(а):
Сделать БПФ сигнала, после чего вычислить амплитуду интересующей гармоники как корень квадратный из суммы квадратов ее комплексных составляющих.



Вот этот момент, мне кажется самый интересный... :)
На первой странице этот форума, уважаемый Jordan опубликовал вот такой участок кода:

Код: Выделить всё

for (int k = 0; k < 1024; k++)
            {
                for (int n = 0; n < 1024; n++)
                {
                    x_real[k] += x_n[n] * Math.Cos( (-2) * Math.PI * k * n / 1024 );
                    x_imag[k] += x_n[n] * Math.Sin( (-2) * Math.PI * k * n / 1024);
                }

                x_Ampl[k] = Math.Sqrt( x_real[k] * x_real[k] + x_imag[k] * x_imag[k] );

               
            }


Здесь нет готовых таблиц син/кос , поэтому мне этот участок кода показался очень привлекательным... :)
Насколько я понял, здесь берутся как раз данные из массива в 1024 значения.
Это у нас x_n[]...
Далее из данных (отсчётов) этого массива создаются ещё два массива с действительной и мнимой составляющей...
Причём, каждое значение действительной и мнимой частей есть сумма произведений каждого отсчёта на синус и косинус соответственно...
Вот тут я не понял почему стОит (-2), а не просто 2 ?
И не понял насчёт делителя 1024 при вычислениях синуса и косинуса?...
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: FFT на Си для AVR

Сообщение YS »

На первой странице этот форума, уважаемый Jordan опубликовал вот такой участок кода:


Собственно, здесь мы видим вычисление скалярного произведения функций "в лоб", как оно есть. Да, этот код дает хорошее представление о том, как по существу устроено ДПФ, но совершенно не оптимизирован. БПФ с таблицами будет работать куда быстрее. :)

Здесь нет готовых таблиц син/кос , поэтому мне этот участок кода показался очень привлекательным...


Таблицы просто ускоряют вычисление. Вычисление тригонометрических функций - очень долгая операция. БПФ еще сильнее ускоряет вычисление за счет использования свойств уравнений ДПФ.

Причём, каждое значение действительной и мнимой частей есть сумма произведений каждого отсчёта на синус и косинус соответственно...


Скалярно перемножаем сигнал на базовые функции, да.

Вот тут я не понял почему стОит (-2), а не просто 2 ?


Это всего лишь вращение фазы на 180°. Сложно сказать, зачем, можно и без этого, как мне кажется.

И не понял насчёт делителя 1024 при вычислениях синуса и косинуса?...


Нормализация аргумента к диапазону [0,1].

То есть, например, имеем sin(wt), где w=2пf, t лежит в диапазоне [0,1]. Вот мы и подгоняем t к этому диапазону, деля k на 1024 (максимальное значение k).

Я бы не рекомендовал использовать этот код в реальном приложении, он страшно медленный. Для AVR существует оптимизированная версия БПФ.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Ответить

Вернуться в «AVR»