Нагуглил интересную статью http://www.enlight.ru/demo/faq/smth.pht ... nd_filters Начал пытаться реализовать, да вот в чем загвостка; по расчетам мне нужен масив из 200 замеро на частоте АЦП 62,500к кГц. Но как АЦП настроить? По прирываниям, или это можно без таймеров организовать? Если несложно, помогите!!! Пишу в кодевиженавр. Как настроить замеры на частоте АЦП?
FFT на Си для AVR
- Сообщения: 11
- Зарегистрирован: Чт сен 19, 2013 19:52:13
Извеняюсь за выход из темы, но мне неккому обратиться :
Нагуглил интересную статью http://www.enlight.ru/demo/faq/smth.pht ... nd_filters Начал пытаться реализовать, да вот в чем загвостка; по расчетам мне нужен масив из 200 замеро на частоте АЦП 62,500к кГц. Но как АЦП настроить? По прирываниям, или это можно без таймеров организовать? Если несложно, помогите!!! Пишу в кодевиженавр. Как настроить замеры на частоте АЦП?
Нагуглил интересную статью http://www.enlight.ru/demo/faq/smth.pht ... nd_filters Начал пытаться реализовать, да вот в чем загвостка; по расчетам мне нужен масив из 200 замеро на частоте АЦП 62,500к кГц. Но как АЦП настроить? По прирываниям, или это можно без таймеров организовать? Если несложно, помогите!!! Пишу в кодевиженавр. Как настроить замеры на частоте АЦП?
- Реклама
AVR'ка (mega) может только до 15 кГц оцифровывать. У вас внешнее АЦП?
Россия навсегда!
- Сообщения: 11
- Зарегистрирован: Чт сен 19, 2013 19:52:13
Нет. В кодевижене, в кодевизарде при кварце 8МГц минимальная частота 62,500 кГц, я так понял- єто частота дискретизацыи?
Частота дискретизации - скорость, с которой мы получаем отсчёты. Так вот, если нам нужны полные 10 бит от АЦП, то частота его тактирования должна быть в районе 50 - 200 кГц. При этом на одно преобразование тратится около 13 тактов, итого: 200 кГц / 13 ~= 15 kamples[P]erecond, т.е. 15 000 отсчётов с разрешением 10 бит в секунду - вот это и есть частота дискретизации. Можно её увеличить, но тогда это уже будет не 10-битное АЦП.
Россия навсегда!
- Сообщения: 11
- Зарегистрирован: Чт сен 19, 2013 19:52:13
Спасибо, понятно стало!Но как заносить измерения беспрерывно в массив? как я понял это можно сделать прерываниями АЦП но как и где это писать для кодевижена, приведите пожалуйста пример!
- Реклама
А чем вам результат работы Wizard'а в CodeVision не пример? Там же вроде формируется почти готовый шаблон. Возьмите документацию на мк, покумекайте над настройками этого формирователя исходников, сгенерируйте что-нить, запустите в симуляторе, посмотрите как работает. Если не работает как надо, то заливайте код проекта сюда, народ посмотрит, подскажет. Я не большой спец по CodeVision, поэтому не могу тут помочь сильно. Наверняка найдётся кто-нибудь кто подскажет.
Россия навсегда!
- Сообщения: 11
- Зарегистрирован: Чт сен 19, 2013 19:52:13
Да вроде настроил, но где и как писать прерывания? У меня необходимость заносить данные в 200-от значный масив по прерывания АЦП. Данные зваковой частоты на 0 вход, на остальные 3 напряжение потенцыометров(их можна заносить в дну переменную, оновляя её).
Вроде настроиный, но где и как написать прерывания чтобы Данные 0-ого порта заносились последовательно в масив, по кругу?
Вроде настроиный, но где и как написать прерывания чтобы Данные 0-ого порта заносились последовательно в масив, по кругу?
- Вложения
-
- Фильтр.rar
- (25.66 КБ) 214 скачиваний
- Сообщения: 11
- Зарегистрирован: Чт сен 19, 2013 19:52:13
Версия 1.1. Вроде считываю значение звуковой амплитуды с нулевого входа, а остальные 3 -с регуляторов, они просто обновляються.
далее нахожу среднее арифмитическое значений и записую в переменную Ф. (значение звуковой амплитуды с нулевого входа это отличие действительного значения от средины питания. ПРОВЕРЬТЕ ПЛИЗ!!! (Данная прога нужна для фильтра усреднением)
далее нахожу среднее арифмитическое значений и записую в переменную Ф. (значение звуковой амплитуды с нулевого входа это отличие действительного значения от средины питания. ПРОВЕРЬТЕ ПЛИЗ!!! (Данная прога нужна для фильтра усреднением)
- Вложения
-
- Фильтр 1.1.rar
- (32.36 КБ) 205 скачиваний
Приветствую всех!
Не подскажете, есть ли какой-нибудь готовый алгоритм нахождения амплитуд шестнадцати заданных частот в сигнале? Частота сэмплирования 8кГц, длина 40мс (320 выборок), частоты: 697, 770, 852, 941, 1209, 1336, 1477, 1633Гц и их удвоенные значения. Желательно на Си для AVR.
Не подскажете, есть ли какой-нибудь готовый алгоритм нахождения амплитуд шестнадцати заданных частот в сигнале? Частота сэмплирования 8кГц, длина 40мс (320 выборок), частоты: 697, 770, 852, 941, 1209, 1336, 1477, 1633Гц и их удвоенные значения. Желательно на Си для AVR.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Есть. Алгоритм Гёрцеля.Не подскажете, есть ли какой-нибудь готовый алгоритм нахождения амплитуд шестнадцати заданных частот в сигнале?
https://ru.wikipedia.org/wiki/Алгоритм_Гёрцеля
http://www.embedded.com/design/configur ... -Algorithm
http://www.ti.com/lit/an/spra066/spra066.pdf
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Не подскажете, какой алгоритм реализован в телефонах РУСЬ? У них ведь в схеме нет ни аппаратного декодера DTMF, ни даже АЦП. "Оцифровка" сигнала тлф.линии производится при помощи компаратора, а вычисления в микроконтроллере типа 80C31/80C51. Тем не менее они декодируют DTMF пакеты АОН и сигналы дистанционного управления функциями телефона.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Я никогда в жизни не видел этого самого телефона, но гугление показало, что там до версии "Русь 28 Соната" применяется, цитирую, вычисление корреляции с функциями Радемахера.какой алгоритм реализован в телефонах РУСЬ?
Почитать про это можно тут.
UPD: Статья, ссылка на которую есть в материале по второй ссылке, судя по всему более недоступна. Почитать ее можно благодаря Wayback Machine. Вкратце - компаратор есть однобитный АЦП, и этого достаточно для определения частот DTMF корреляционным методом.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Спасибо большое, это уже хоть что-то.
Если честно, думал там всё намного проще, считаются промежутки между фронтами, с чем-то сравниваются и получается результат.
Если честно, думал там всё намного проще, считаются промежутки между фронтами, с чем-то сравниваются и получается результат.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Ну, промежутки вряд ли чего дадут. Все же это изначально спектральный метод кодирования, так что тут все полюбому будет упираться в корреляционный/спектральный анализ в том или ином виде.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 27
- Зарегистрирован: Пн мар 23, 2015 17:18:47
Доброго времени, многоуважаемое сообщество!
Очень рад присоединиться к вам!
Прошу помочь мне разобраться в понимании следующего...
Никак не могу понять такую вещь, как создание алгоритма для определения амплитуды нужной частоты в спектре сигнала.
В общем, всё по порядку...
У меня есть некий массив, считанных с АЦП значений (допустим это массив, длиной в 64 значения),
с частотой дискретизации 19200 Гц. Данные эти 10-ти битные (обычный АЦП АТМеги).
Теперь мне нужно определить в этом 64-х битном отсчёте амплитуду некой частоты (к примеру 1000Гц).
Прочёл по этому поводу уже очень много... Голова опухла....
Видел в интернете много всевозможных цветомузык и спектроанализаторов, включая исходники.
Многие из них использовали готовые библиотеки и таблицы синусов/косинусов для вычислений...
Тут я совсем заблудился...
Так что же мне делать с этим 64-х битным отсчётом, чтобы получить значение амплитуды нужной частоты?
Искать таблицы синусов/косинусов для частоты 1000Гц?
Тогда получается, что для получения значений амплитуд 10 частот нужно искать (или вычислять с помощью сторонних программ)
значения син/кос для всех 10-ит частот?
Так это 20 таблиц!...
Или что нужно делать-то?
Понять хочу, как эту высокую материю, как БПФ применить для конкретной задачи.
Саму последовательность понять хочу... Не в коде дело - код напишу сам, проверю и отлажу...
Но принцип сам...
В голове всё раскидано отдельными кусками - БПФ... таблицы син/кос... массивы с отсчётами...
Что с этим делать - не пойму...
Не судите строго - мне уже не 20 лет (и даже не 40)...
Может быть потому и не схватываю всё так быстро... Да и БПФ никогда не занимался...
Будьте любезны рассказать всё по порядку - буду безмерно благодарен!
Очень рад присоединиться к вам!
Прошу помочь мне разобраться в понимании следующего...
Никак не могу понять такую вещь, как создание алгоритма для определения амплитуды нужной частоты в спектре сигнала.
В общем, всё по порядку...
У меня есть некий массив, считанных с АЦП значений (допустим это массив, длиной в 64 значения),
с частотой дискретизации 19200 Гц. Данные эти 10-ти битные (обычный АЦП АТМеги).
Теперь мне нужно определить в этом 64-х битном отсчёте амплитуду некой частоты (к примеру 1000Гц).
Прочёл по этому поводу уже очень много... Голова опухла....
Видел в интернете много всевозможных цветомузык и спектроанализаторов, включая исходники.
Многие из них использовали готовые библиотеки и таблицы синусов/косинусов для вычислений...
Тут я совсем заблудился...
Так что же мне делать с этим 64-х битным отсчётом, чтобы получить значение амплитуды нужной частоты?
Искать таблицы синусов/косинусов для частоты 1000Гц?
Тогда получается, что для получения значений амплитуд 10 частот нужно искать (или вычислять с помощью сторонних программ)
значения син/кос для всех 10-ит частот?
Так это 20 таблиц!...
Или что нужно делать-то?
Понять хочу, как эту высокую материю, как БПФ применить для конкретной задачи.
Саму последовательность понять хочу... Не в коде дело - код напишу сам, проверю и отлажу...
Но принцип сам...
В голове всё раскидано отдельными кусками - БПФ... таблицы син/кос... массивы с отсчётами...
Что с этим делать - не пойму...
Не судите строго - мне уже не 20 лет (и даже не 40)...
Может быть потому и не схватываю всё так быстро... Да и БПФ никогда не занимался...
Будьте любезны рассказать всё по порядку - буду безмерно благодарен!
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Рады вас приветствовать!Очень рад присоединиться к вам!
Чтобы получить более-менее честные 10 бит от АЦП атмеги, надо очень постараться. В последних двух битах в основном шум, если не принимать особых мер (грамотная трассировка, фильтрация AREF, и т.д.). Так что можете смело ставить бит ADLAR и использовать только старшие восемь бит.Данные эти 10-ти битные (обычный АЦП АТМеги).
Для этого не нужно БПФ. Достаточно алгоритма Гёрцеля [1] [2]. Единственно только, сам по себе он, разумеется, рассчитан на вычисления с плавающей точкой, так что в случае AVR придется немного заморочиться над переделкой его на фиксированную точку. Но там основная формула достаточно простая, так что особых сложностей быть не должно.Теперь мне нужно определить в этом 64-х битном отсчёте амплитуду некой частоты (к примеру 1000Гц).
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 27
- Зарегистрирован: Пн мар 23, 2015 17:18:47
Спасибо большое за доброе приветствие и тёплые слова!
Да, по ходу всех моих путешествий по интернету я встречал ссылки на алгоритм Гёрцеля...
Так же понимаю, что для каждой конкретной задачи подобного типа обычно выбирают алгоритм, который будет необходимым и достаточным для решения данной конкретной задачи.
Но мне хотелось бы понять как при помощи именно БПФ решить эту задачу?
Просто я задал совсем простой вопрос о вычислении амплитуды конкретной частоты в спектре...
Как быть, если понадобиться собрать (пусть примитивный) анализатор спектра, скажем в диапазоне 1-5000 Гц?
Поэтому очень хочется понять, как в этом случае будет выглядеть алгоритм обработки вышеуказанного массива?
Можно ли этот массив изначально пропустить через БПФ, а после определить значение амплитуды какой из частот я хочу увидеть?
Уже прочёл книгу Ю. Сато по этому поводу...
Мозги, конечно накренились... Но, надеюсь не до конца...
Да, по ходу всех моих путешествий по интернету я встречал ссылки на алгоритм Гёрцеля...
Так же понимаю, что для каждой конкретной задачи подобного типа обычно выбирают алгоритм, который будет необходимым и достаточным для решения данной конкретной задачи.
Но мне хотелось бы понять как при помощи именно БПФ решить эту задачу?
Просто я задал совсем простой вопрос о вычислении амплитуды конкретной частоты в спектре...
Как быть, если понадобиться собрать (пусть примитивный) анализатор спектра, скажем в диапазоне 1-5000 Гц?
Поэтому очень хочется понять, как в этом случае будет выглядеть алгоритм обработки вышеуказанного массива?
Можно ли этот массив изначально пропустить через БПФ, а после определить значение амплитуды какой из частот я хочу увидеть?
Уже прочёл книгу Ю. Сато по этому поводу...
Мозги, конечно накренились... Но, надеюсь не до конца...
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Сделать БПФ сигнала, после чего вычислить амплитуду интересующей гармоники как корень квадратный из суммы квадратов ее комплексных составляющих.Но мне хотелось бы понять как при помощи именно БПФ решить эту задачу?
В результате БПФ вы получаете относительные амплитуды (точнее - разложение на комплексные составляющие, то есть фаза тоже учитывается) всех рассматриваемых гармоник. Выбирайте нужную и анализируйте...Можно ли этот массив изначально пропустить через БПФ, а после определить значение амплитуды какой из частот я хочу увидеть?
Дискретное преобразование Фурье в сущности есть вычисление скалярных произведений сигнала с каждой из функций из определенного набора. То есть для каждой базовой функции из набора мы определяем, сколько ее есть в рассматриваемом сигнале.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 27
- Зарегистрирован: Пн мар 23, 2015 17:18:47
Вот этот момент, мне кажется самый интересный...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 при вычислениях синуса и косинуса?...
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Собственно, здесь мы видим вычисление скалярного произведения функций "в лоб", как оно есть. Да, этот код дает хорошее представление о том, как по существу устроено ДПФ, но совершенно не оптимизирован. БПФ с таблицами будет работать куда быстрее.На первой странице этот форума, уважаемый Jordan опубликовал вот такой участок кода:
Таблицы просто ускоряют вычисление. Вычисление тригонометрических функций - очень долгая операция. БПФ еще сильнее ускоряет вычисление за счет использования свойств уравнений ДПФ.Здесь нет готовых таблиц син/кос , поэтому мне этот участок кода показался очень привлекательным...
Скалярно перемножаем сигнал на базовые функции, да.Причём, каждое значение действительной и мнимой частей есть сумма произведений каждого отсчёта на синус и косинус соответственно...
Это всего лишь вращение фазы на 180°. Сложно сказать, зачем, можно и без этого, как мне кажется.Вот тут я не понял почему стОит (-2), а не просто 2 ?
Нормализация аргумента к диапазону [0,1].И не понял насчёт делителя 1024 при вычислениях синуса и косинуса?...
То есть, например, имеем sin(wt), где w=2пf, t лежит в диапазоне [0,1]. Вот мы и подгоняем t к этому диапазону, деля k на 1024 (максимальное значение k).
Я бы не рекомендовал использовать этот код в реальном приложении, он страшно медленный. Для AVR существует оптимизированная версия БПФ.
Разница между теорией и практикой на практике гораздо больше, чем в теории.


