|
Определение периода сигнала, нужен простой алгоритм |
|
|
|
Aug 23 2010, 14:10
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (scifi @ Aug 23 2010, 18:00)  И ещё для обсуждения полезно будет указать, в каком диапазоне может меняться период. Для гитары частоты от 80 до 330 Гц. Желательно, чтобы получилось для полного диапазона фортепиано -- 27 - 4200 Гц. Все програмные тюнеры для компа что я видел тупо измеряют частоту и пользовать их довольно сложно из-за того, что правильно они показывают только долю секунды. Китайский аппаратный тюнер работает значительно лучше, но все-равно на басовых струнах подглючивает. Интерес чисто академический, особой практической цели не преследует. Ну если получится удобоваримый алгоритм можно и железку сделать.
|
|
|
|
|
Aug 23 2010, 14:16
|
Гуру
     
Группа: Почетный участник
Сообщений: 6 851
Регистрация: 25-08-08
Из: Запорожье
Пользователь №: 39 802

|
Цитата(Taradov Alexander @ Aug 23 2010, 16:01)  На картинке приведено несколько периодов колебания басовой струны гитары. Красным отмечен ожидаемый период. Необходимо определить частоту колебаний, но прямой подсчет дает в 2 раза завышенный результат, так как там полно гармоник, но на глаз период хоршо заметен. При этом амплитуда "внутреннего" колебания изменяется от полного пропадания, до равной и даже большей, чем "основного" колебания. Нужен способ определить период, Странная проблема.... "Ожидаемый период"- скорее всего, "неожиданный", это попытка измерить вторую субгармонику. Из теории колебаний период однозначно связан с основонй частотой колебаний. Никакие гармоники не могут изменить его, могут изменить только форму колебаний, но не период. Т.е тембр струны может быть разным, но не основонй тон, частота. Посему, нужно считать время меж пересечениями сигналом нуля, это даст полупериод. Время между фронтами или спадами даст период. Сигнал перед оцифровкой нужно пропустить через нуль-компаратор (усилитель с большим коэффициентом усиления). "Ля" первой октавы должно давать 440гц.
|
|
|
|
|
Aug 23 2010, 14:47
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (Microwatt @ Aug 23 2010, 18:16)  Странная проблема.... "Ожидаемый период"- скорее всего, "неожиданный", это попытка измерить вторую субгармонику. Красным изображен период соответствующей частоте 82 Гц, 6 струна гитары. Синим - реальное колебание этой струны. Есть моменты, когда реальное колебание почти синус, но большую часть времени по нему бегут такие "волны". Програмные тюнеры схватываются за моменты чистой синусоиды, но они длятся долю секунды. QUOTE (Microwatt @ Aug 23 2010, 18:16)  Из теории колебаний период однозначно связан с основонй частотой колебаний. Никакие гармоники не могут изменить его, могут изменить только форму колебаний, но не период. Т.е тембр струны может быть разным, но не основонй тон, частота. Именно так. Форма колебаний изменяется настолько, что в определенные моменты времени пересечений сигнала с 0 становится больше, но период сигнала не изменился и это видно из картинки. Такого искажения формы достаточно, чтобы простой метод подсчета длительности сигнала между пересечениями нуля давал сбои. QUOTE (Microwatt @ Aug 23 2010, 18:16)  Посему, нужно считать время меж пересечениями сигналом нуля, это даст полупериод. Время между фронтами или спадами даст период. Сигнал перед оцифровкой нужно пропустить через нуль-компаратор (усилитель с большим коэффициентом усиления). "Ля" первой октавы должно давать 440гц. Это все в теории (ну и на практике для более высокочастотных струн), но не работает для басовых струн, у них очень богатый спектр. QUOTE (Oldring @ Aug 23 2010, 18:31)  В настоящее время уже очень странное требование. В конечном итоге важны цена и потребление. Если по цене действительно можно найти альтернативы, то по потреблению уже сложнее (ну если не пускать АРМ на 16 МГц, конечно). Кроме применение мощного процессор противоречит самой идее простого гитарного тюнера.
|
|
|
|
|
Aug 23 2010, 15:27
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (Oldring @ Aug 23 2010, 19:17)  У вас действительно миллионные тиражи, чтобы бороться за плюс-минус доллар цены? Нет, у меня вообще нет планов по выпуску его. Возможно DSP будет и лучше. Можно убрать из вопроса требование к ресурсам. FFT напрямую все-равно не подходит из-за недостаточного разрешения и неоднозначности результатов. Необходимо разрешение в единицы герц, желательно в десятые доли (это то, что заявляют китайцы в железках, но насколько им можно верить не мне судить). В спектре ложные составляющие иногда превышают по амплитуде правильные. ----------- Прицепил wav-файл с записью звука всех струн, если кому интересно поэкспериментировать. В матлабе можно сделать data = wavread('guitar2.wav'); и он весь ваш
Сообщение отредактировал Taradov Alexander - Aug 23 2010, 15:31
|
|
|
|
|
Aug 23 2010, 15:51
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (Alex11 @ Aug 23 2010, 19:28)  Вы бы поиграли с модельками, тем более, что у Вас есть разные варианты записанного сигнала. Возможно, что Вам будет достаточно очень небольшого по буферу Фурье, чтобы определить основную частоту. Нужно только разойтись с гармониками, а дальше уточнить частоту по огибающей. Я и играюсь тут, просто коллективный разум хотел еще привлечь, иожет велосипед изобретаю. Так же попробовал метод описанный в одном из блогов: QUOTE The solution I used is a pretty simple one. We set two thresholds (a positive and a negative one), and start counting when the signal value becomes higher than the positive threshold. We keep counting and wait for the signal to go below the negative threshold, then wait for it to go above the positive one again. This sometimes helps us count only the transitions we’re interested in. Он дает правильное определение чаще чем обычный подсчет переходов через ноль, но все-равно ошибается, когда амплитуда "помехи" достаточно велика. Вот 4 последовательных периода наложенные друг на друга. Видно, что они отличаются незначительно, но внутри самого периода у них есть особенности и характерные неравномерности. Но сам период я вычислил зная частоту струны и то, что струна был настроена. В идеале нужен алгоритм, который найдет подобную зависимость и определит период.
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 23 2010, 16:06
|
Гуру
     
Группа: Почетный участник
Сообщений: 6 851
Регистрация: 25-08-08
Из: Запорожье
Пользователь №: 39 802

|
Цитата(Taradov Alexander @ Aug 23 2010, 18:51)  Он дает правильное определение чаще чем обычный подсчет переходов через ноль, но все-равно ошибается, когда амплитуда "помехи" достаточно велика.
Вот 4 последовательных периода наложенные друг на друга. Видно, что они отличаются незначительно, но внутри самого периода у них есть особенности и характерные неравномерности. Но сам период я вычислил зная частоту струны и то, что струна был настроена.
В идеале нужен алгоритм, который найдет подобную зависимость и определит период. Вы привели картинки неполностью, неаккуратно наложенных колебаний. Форма их может несколько отличаться, но частота (период) одинаковы. Возможно, я чего-то в Вашей формулировке не понимаю, но ни о каких "помехах" речь идти не должна. Период легко должен определяться через подсчет времени переходов через нуль. Вы как и чем пытаетесь измерять? Неужели по-эмбеддерски, с помощью АЦП?
|
|
|
|
|
Aug 23 2010, 16:18
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (Microwatt @ Aug 23 2010, 20:06)  Возможно, я чего-то в Вашей формулировке не понимаю, но ни о каких "помехах" речь идти не должна. На первой картинке я черным изобразил период синуса (как смог, извините) 82 Герц. Я вполне уверен, что струна колеблется именно с этой частотой. Искажение ("провал") по центру - это особенность огибающей этой струны, простое определение по пересечениям даст удвоенную частоту. Вторая картинка - то-же эффект, но не так сильно выраженный. Период сигнала заключен между двумя большими "горбами". Так что просто посчетом переходов через ноль нельзя отделаться. -------------------- И еще один рисунок где проблема видна очень хорошо. Период OK по переходам через 0 определится правильно, период BAD - нет.
Сообщение отредактировал Taradov Alexander - Aug 23 2010, 16:31
Эскизы прикрепленных изображений
Прикрепленные изображения
|
|
|
|
Guest_@Ark_*
|
Aug 23 2010, 17:42
|
Guests

|
Судя по Вашему описанию и картинкам, главное отличие основной частоты от остальных в том, что ее амплитуда меняется гораздо медленнее - практически постоянна на их фоне. Если это предположение верно, то попробуйте за него как-то "зацепиться" при выработке алгоритма.
|
|
|
|
|
Aug 23 2010, 18:29
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (rezident @ Aug 23 2010, 21:51)  Может я чего-то не понял, но почему из всего спектра нельзя выбрать наименьшую частоту? К тому же, если диапазон изменения основной частоты при разном натяжении для каждой струны примерно известен, то можно корреляцию с требуемой частотой посчитать. Вот спектр той-же 6-ой струны. Нужен какой-то хороший критерий поиска. Курсором помечена нужная частота. Слева от нее сравнимого уровня "палка" 50 Гц - это похоже сеть, не ожидал ее тут увидеть, попробую отфильтровать. Максимум - это 160 Гц, та самая "помеха". Кроме того приведеный FFT сделан по 83000 точек (вся выборка), если делать окнами реального размера, то получется каша и недостаточное разрешение (хотя для первого приближения может и подойдет). Делать фильтры на частоты конкретных струн нельзя, так как они могу быть значительно рассторены (иногда специально), нужно именно определить частоту и сказать к какой ноте она ближе всего и на сколко процентов не совпадает с ней.
Эскизы прикрепленных изображений
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|