Помогите в написании программы для определения частоты звука(240-280Гц)
- Войдите на сайт для отправки комментариев
Сб, 25/06/2016 - 12:40
Нужна программа для определения частоты звука с условием. К примеру если частота повторяется и она равна 240-280Гц то делает определённое действие. С ардуино знаком но в програмировании не селён так сказать я больше по технической а не программной. Подскажите с чего можно начать, может есть какие то библеотоеке по работе со звукаом?
Есть какие то библеотоеке по работе со звукаом, определённо: https://www.google.ru/search?q=%D0%BA%D0%B0%D0%BA%D0%B8%D0%B5+%D1%82%D0%BE+%D0%B1%D0%B8%D0%B1%D0%BB%D0%B5%D0%BE%D1%82%D0%BE%D0%B5%D0%BA%D0%B5+%D0%BF%D0%BE+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5+%D1%81%D0%BE+%D0%B7%D0%B2%D1%83%D0%BA%D0%B0%D0%BE%D0%BC&oq=%D0%BA%D0%B0%D0%BA%D0%B8%D0%B5+%D1%82%D0%BE+%D0%B1%D0%B8%D0%B1%D0%BB%D0%B5%D0%BE%D1%82%D0%BE%D0%B5%D0%BA%D0%B5+%D0%BF%D0%BE+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5+%D1%81%D0%BE+%D0%B7%D0%B2%D1%83%D0%BA%D0%B0%D0%BE%D0%BC&aqs=chrome..69i57.675j0j7&sourceid=chrome&ie=UTF-8
Библиотека fft для ардуино. Секретом не является. Описана везде. Какая-то еще помощь нужна?
-----------------------------------------------
Подумав о том, кто и с каким бэкграундом читает форум, вынужден добавить: fft это фаст Фурье трансформ, то есть быстрое преобразование Фурье. Как оно связано с определением частоты звука? Ликбез только за деньги!
Библиотека fft для ардуино. Секретом не является. Описана везде. Какая-то еще помощь нужна?
DIYMan! А ты вот не можеш не потъепнуть живова чилавека, да? ))
DIYMan! А ты вот не можеш не потъепнуть живова чилавека, да? ))
Ну чтобы потъепнуть мьортвага - у меня как-то ещё не получалось :) А если серьёзно - ну видно же, что очередное "дайте мне фсьо и прямо здесь!". Если бы чел имел хоть грамм желания разобраться самому - ввёл бы строчку поиска в гугле. А так как я действительно хотел помочь - я просто немного поработал lmgtfy, вот и всё.
Подскажите с чего можно начать
Начните либо с изучения программирования, либо с заказа программы в разделе "Ищу исполнителя".
Частоту можно мерять измеряя период. Например при помощи pulseln(). Но со звуком не представляю как. Может проще поставить фильтр который отфильтрует все лишнее кроме 240-280Гц и подать сигнал на пин... но это уже не программирование.
А что значит - "со звуком"? Имеется сигнал постоянной частоты и надо определить эту частоту?
Тогда надо подать этот сигнал на аналоговый вход, записать 1000 отсчетов в массив через АЦП, используя analogread()
Затем пробежаться в цикле по полученному массиву и найти переходы через 0 (или другой уровень) и померять. сколько микросекунд между этими переходами
зы. код на ошибки не проверял
кутузов и diakin дали вредные советы. Фильтр снаружи - позапрошлый век, а еще и на такие частоты - вобще мрак, еще можна на грамофон записать и под микроскопом рассматривать. Сохранять в массив и потом ловить переходы через ноль плохо - постоянная составляющая, дрейф нуля, шумы и наводки приведут к тому что момент перехода через ноль будет "плавать". Но если уж очень хочется так - то буфер нахрена? Сразу после ввода и анализируйте налету что там выходит. Ну и float убрать конечно.
Правильные решения:
1. FFT то что Вы его не понимаете не важно, его 90% использующих не понимают.
2. Цифровой фильтр, гуглите БИХ, КИХ они менее ресурсоемки чем FFT.
Что лучше? Мало информации от вас чтоб выбрать.
ловить переходы через ноль плохо - постоянная составляющая, дрейф нуля, шумы и наводки приведут к тому что момент перехода через ноль будет "плавать".
Частотомер частоту реального сигнала как измеряет? С шумами, наводками и плавньем нуля...
В частотомере для борьбы с этим имеет много схем формирования сигнала перед подсчетом.
В частотомере для борьбы с этим имеет много схем формирования сигнала перед подсчетом.
Это прошлый век. )))
Сейчас можно всю обработку сделать программно, но для этого нужно сначала сохранить данные в буфер.
В том числе и для последующего FFT.
Частотомер частоту реального сигнала как измеряет? С шумами, наводками и плавньем нуля...
Ну, не так же, как у Вас, правда?
Вы посмотрите на Ваш скетч и ответьте когда (и с какой периодичностью" Вы делаете измерения (т.е. вызываете analogRead)? Ответ: вызываю, когда loop до неё доберётся - как часто - как получится. Вот и ответ на точность Вашего метода - "как получится".
Нет, не (совсем) так. Loop добирается туда с регулярной периодичностью )
Вернее даже не Loop, а цикл в котором формируется массив отсчетов.
AnalogVal0[i] = analogRead(A0); // выполняется на DUE примерно за 5 мкс
delayMicroseconds(100);//
Так что частота дискретизации и время измерения вполне стабильны.
Нет, не (совсем) так. Loop добирается туда с регулярной периодичностью )
Вернее даже не Loop, а цикл в котором формируется массив отсчетов.
AnalogVal0[i] = analogRead(A0); // выполняется на DUE примерно за 5 мкс
delayMicroseconds(100);//
Так что частота дискретизации и время измерения вполне стабильны.
Проверьте осциллографом. Узнаете много нового и интересного :))))
Стабильно было бы, если бы Вы при этом ещё и прерывания закрыли, а так ... см. осциллограмму вот здесь. Там и обсуждение есть почему такие фокусы случаются.
>Видимо, в этот момент произошло прерывание от таймера и контроллер занялся своей работой по подсчёту >миллис и т.п., а наша программа покорно ждала пока там всё сделается.
Ну это да, может быть. Хотя зачем таймеру дергать прерывания.. По хорошему он должен непрерывно считать [предделённые] такты, и только по вызову millis контроллер будет читать значение из таймера и переводить его в мс\мкс. Это если по-хорошему. Хотя наверное так и есть )
Ну это да, может быть. Хотя зачем таймеру дергать прерывания.. По хорошему он должен непрерывно считать [предделённые] такты, и только по вызову millis контроллер будет читать значение из таймера и переводить его в мс\мкс. Это если по-хорошему. Хотя наверное так и есть )
Посмотрите как это реально сделано. Исходники же все есть, вместе с IDE приходят.