Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/294: Рейтинг темы: голосов - 294, средняя оценка - 4.82
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371

Как узнать частоту звука?

20.01.2012, 16:11. Показов 65050. Ответов 252
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
народ,подскажите кто знает.обработкой сигнала нигода не занимался,поэтому если что-то говорю не правильно хочу программно определить к какой ноте принадлежит звук. Имею частоту дискретизации 8кГц и глубину 16 бит. значения этой выборки заносятся в массив.
1)Что представляют из себя эти значения?
если я правильно понял то каждый элемент массива это значение частоты в момент времени?
2)что нужно сделать с этим массивом чтобы узнать ноту?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.01.2012, 16:11
Ответы с готовыми решениями:

Как менять частоту звука на STM32
Всем привет, на курсовую дали вот такое задание "Разработать МК устройство которое позволяет в зависимости от нажимаемой кнопки изменять...

Узнать из программы частоту процессора
Приветствую. Подскажите способ узнать из программы частоту процессора (ATMiko32, впрочем хотелось бы универсальный ваирант).

Как узнать частоту звука без сторонних библиотек
кто нибудь знает как в работать со звуком без сторонних библиотек? мне нужно чтобы во время проигрывания звука можно было узнать его...

252
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
09.05.2014, 15:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dimmak Посмотреть сообщение
Вместо "наложения" гармоник друг на друга нужно высчитать соотношение между ними(Т.е делить на предыдущую гармонику ). В результате получим приблизительно 1/2, 1/3, 1/4
Все это прекрасно для чистой ноты
а если звучат вместе две, три?

можно попробовать взять самую низкую частоту, это должна быть основная
потом следующую если кратна низкой то это её гармоника если нет это другая нота
но тут тоже возможны коллизии если взять одни и те же ноты но из разных октав, то покажет что это одна нота
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
09.05.2014, 15:34
Цитата Сообщение от Rem_ Посмотреть сообщение
Хм. То есть предлагаешь сначала искать все громкие частоты?
Можно задать порог 0.25 - 0.4 при максимуме 1.0, а затем
while Mg[i-1]< Mg[i] ; i+= 1 ; max= Mg[i] и т.д. ( Mg - Magnitude )
А в чем проблема то?

Добавлено через 5 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
Все это прекрасно для чистой ноты
а если звучат вместе две, три?
Это виртуозное басс-соло интервалами в стиле фанки?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
09.05.2014, 17:18
Сама программа тут https://cloud.mail.ru/public/e... ndAnalyzer
Если мобилу поднести вплотную к микрофону, магнитуда будет около 800. Можно к примеру искать всё что громче 50. (при изменении количества семплов захвата эти величины изменяются)
На гитаре при начальном обучении играют по две ноты.
Еще есть вопрос по поводу одной ноты. Ведь человек может играть одну ноту несколько раз подряд, и программа должна будет слышать эти разные ноты, определять моменты их извлечения.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
09.05.2014, 18:14
Цитата Сообщение от Rem_ Посмотреть сообщение
Если мобилу поднести вплотную к микрофону, магнитуда будет около 800. Можно к примеру искать всё что громче 50. (при изменении количества семплов захвата эти величины изменяются)
Зачем? Если 800 это 100% тогда 0,25 - это 200. Вам нужны только первые 5-7 гармоник следовательно 200 достаточный начальный порог( вероятно ).
Цитата Сообщение от Rem_ Посмотреть сообщение
На гитаре при начальном обучении играют по две ноты.
Мое сообщение касалось определения одной басовой ноты, не интервалов.
Цитата Сообщение от Rem_ Посмотреть сообщение
Еще есть вопрос по поводу одной ноты. Ведь человек может играть одну ноту несколько раз подряд, и программа должна будет слышать эти разные ноты, определять моменты их извлечения.
1) Если дернуть струну и через секунду еще раз, то препад громкости будет довольно значительным в сторону увеличения. Иначе громкость будет плавно угасать.
2) Программа "начинает" работать при условии, что громкость сигнала выше определенного порога.

Какое количество сэмплов используется для анализа?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
10.05.2014, 01:18
На данный момент 4096. Если возможно определять ноту с меньшего количества (2048, 1024) то я буду очень рад.

Добавлено через 5 часов 43 минуты
Ситуация меняется. Обнаружил, что стояло загрубление микрофона. Исправил.
При диком клипировании (когда телефон в плотную орёт и от волн остаются прямоуголники) значение около 1000.
При звуке на пороге клипирования значение 700.
При мычании сидя у компа значения около 100.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
10.05.2014, 15:37
Сделал визуализатор. Попробовал захватить 2048 семплов. Звук [a]. На спектре видно кучу гармоник. Вот по ним нужно найти основную. Как? Вот в чём вопрос.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
10.05.2014, 16:47
Через расстояние сделал, так нагляднее. Линии на уровнях 25 и 50. Частота 220. Расстояние 50см. до микрофона, буква А. Видно, что самая громкая третья гармоника, по тише вторая, еще тише пятая, и только сейчас ещё тише основная нота.
Кстати, есть мысль для точности анализатора искать вершину не у громкой частоты, а у самой правой. Там дельта между частотами спектра не изменяется, а расстояния между частотами соседних нот увеличивается, что приводит к уменьшению относительной погрешности.
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 11
10.05.2014, 18:00
Цитата Сообщение от Dimmak Посмотреть сообщение
...И для баса тоже.
Вместо "наложения" гармоник друг на друга нужно высчитать соотношение между ними(Т.е делить на предыдущую гармонику ). В результате получим приблизительно 1/2, 1/3, 1/4 и тд.
Очень часто октавная гармоника громче тоники, а 3я гармоника может быть тише 4ой и тд, но соотношение между ними всегда укажет на тонику. Анализ самых громких 5-7 значений Magnitude дает практически безошибочный результат.
Не совсем понимаю термины "октавная гармоника" "тоники". Можете более подробно объяснить алгоритм в терминах частот и их соотношения. Насколько я понимаю в моем случае основная проблема это то, что возникают негармонические обертоны. То есть частоты, не кратные фундаментальной, которые при этом имеют свои гармонии. Именно поэтому HPS дает много пиков. Что то похожее на то что написали вы я обнаружил, декомпильнув одно из приложений из GooglePlay, которое сносно определяет ноты.
Алгоритм выглядит так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      var N_2:int = magnitudes.length;
        var maxL:Number = 0;
        var maxFI:int = 0;
        var f:Number = -1000000;
        for (var var4:int = N_2 - 2; var4 > 1; --var4) {
            for (var var5:int = 2; var5 < 10; ++var5) {
                var k_1:Number = var4 / var5;
                if (df * (0.5 + k_1) > 100.0) {
                    magnitudes[var4] -= 3.0 * (magnitudes[int(0.5 + k_1)] + magnitudes[int(k_1 - 0.5)] + magnitudes[int(k_1)]);
                }
            }
            if (magnitudes[var4] < 0.0) {
                magnitudes[var4] = 0.0;
            }
        }
То есть от каждого значения магнитуды частоты отнимаются сумма значений магнитуды предпологаемой гармоники и двух соседних, зачем-то умноженно на 3. Предполагаемые гармоники находятся с индексами k /2, k/3 .. k / 10. Все что получится меньше нуля -- зануляется. Потом просто ищется максимум среди сумм магнитут в окрестности нужных частот(там нужно искать, в зависимости от настроек инструмента к примеру для нот в промежутке C4 - C6, а не для всех). Странно но это работает лучше чем HPS, хотя здесь фактически умножение заменили на вычитание.
2REM_ насчет низких частот, я склоняюсь к тому, что стоит попробовать вейвлетное преобразование вместо FFT, хотя нигде в прогах, залитых на GooglePlay этого не было, там везде обычный FFT c low-pass hight-pass фильтрами и кучей каких то самодельных костылей, которые работают, но понять что там за алгоритм не представляется возможным. Как минимум IFFT никто не использует, значит Cepstrum отпадает, видел автокорреляцию, но там кроме нее еще фильтры, и куча кода, пока что не особо понятного.
Пока что остается фактом что чистый HPS, Cepstrum, Autocorrelation(кстати она довольно быстро считается с помощь IFFT даже по всему кну) - не работают должным образом.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
10.05.2014, 19:24
Цитата Сообщение от Rem_ Посмотреть сообщение
На данный момент 4096. Если возможно определять ноту с меньшего количества (2048, 1024) то я буду очень рад.
Какая частота дискретизации( 11025 )?
Цитата Сообщение от Rem_ Посмотреть сообщение
Ситуация меняется. Обнаружил, что стояло загрубление микрофона. Исправил.
При диком клипировании (когда телефон в плотную орёт и от волн остаются прямоуголники) значение около 1000.
При звуке на пороге клипирования значение 700.
При мычании сидя у компа значения около 100.
Rem ты в курсе что такое нормализация?

Добавлено через 12 минут
Цитата Сообщение от Rem_ Посмотреть сообщение
Сделал визуализатор. Попробовал захватить 2048 семплов. Звук [a]. На спектре видно кучу гармоник. Вот по ним нужно найти основную. Как? Вот в чём вопрос.
Можно мне файлик с информацией как на графике?

Добавлено через 8 минут
Цитата Сообщение от bobrokrol Посмотреть сообщение
Не совсем понимаю термины "октавная гармоника" "тоники". Можете более подробно объяснить алгоритм в терминах частот и их соотношения. Насколько я понимаю в моем случае основная проблема это то, что возникают негармонические обертоны.
тоника - основной тон( к примеру 220Hz ) Октавная гармоника - 440Hz( 1/2 к тонике ).
bobrokrol, звуковой сэмпл в студию! Щас посмотрим откуда берутся негармонические обертона...
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
12.05.2014, 16:41
Визуализатор звука - https://cloud.mail.ru/public/8... Visualiser
Видно все графики и все частоты в спектре. Выделяется самая громкая.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
12.05.2014, 17:02
Rem
Можешь выложить звуковой файл( sound wave ) который анализируешь???
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
12.05.2014, 17:42
Ты тему читаешь? Нет файла. Включи у себя на ноуте микрофон и скажи букву а, получишь звуковую волну 2048 семплов.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
12.05.2014, 18:49
Цитата Сообщение от Rem_ Посмотреть сообщение
Ты тему читаешь? Нет файла. Включи у себя на ноуте микрофон и скажи букву а, получишь звуковую волну 2048 семплов.
Я сейчас опишу "цель", если ошибусь - исправь пожалуйста.
Нужно определить основной тон инструмента( гитары или баса ). Звучит одна нота.
sr= 44100. Размер окна - 2048.
И почему именно такой размер окна можешь объяснить?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
12.05.2014, 18:59
При таком окне будет анализироваться около 20 раз в секунду. 2048 семплов для быстроты, не с особой точностью. Музыкальные игры, которые будут слушать звук и реагировать на него.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
12.05.2014, 19:20
Цитата Сообщение от Rem_ Посмотреть сообщение
При таком окне будет анализироваться около 20 раз в секунду. 2048 семплов для быстроты, не с особой точностью. Музыкальные игры, которые будут слушать звук и реагировать на него.
Тогда это уже распознование речи. Я в этой теме не смыслю.
А вот по-поводу инструментов( гитары-баса ), есть нюанс: когда только начинает звучать нота - выстота основного тона может быть выше в пределах тона-полтора на протяжении 1/4 -1/3 секунды, в зависимости от "силы" извлечения. Что скажешь по этому поводу?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
12.05.2014, 21:05
Весь код визуализатора тут - https://github.com/Remeslennik/SoundVisualiser
Консольный вариант там рядом.
2
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
12.05.2014, 21:21
Клас! Аппроксимация( уточнение ) пиков выполняется какой функцией?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
12.05.2014, 22:56
Поиск вершины параболы по трём точкам VerPar() строка 600
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
12.05.2014, 23:11
Цитата Сообщение от Rem_ Посмотреть сообщение
Поиск вершины параболы по трём точкам VerPar() строка 600
http://www.dspguru.com/dsp/how... e-fft-peak
Самостоятельно я не сравнивал методы, но возможно некоторые из них дадут более точный результат, что может быть актуально при окнах меньшего размера.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
13.05.2014, 22:47
Где-то вычитал, что лепестки имеют форму параболы, потому и делаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2014, 22:47

Как узнать частоту, амплетуду, длинну и т.д. звука в данный момент?
Здравствуйте! Как узнать частоту, амплетуду, длинну, скорость и т.д. звука в данный момент? ВОТ загрузил компонент(delphi new audio...

Как получить частоту звука?
Здравствуйте! как получить частоту звука? MediaPlayer1.FileName := 'sound.mp3'; if MediaPlayer1.Media &lt;&gt; nil then begin...

Как узнать частоту процессора?
Подскажите как узнать частоту процессора?

Как узнать частоту прцессора?
Как узнать частоту прцессора?

Как узнать начальную частоту?
собственно говоря для моей gtx 460 по сайту нвидии стандартная частота ядра 675, памяти - 1800. Так все и было, пока не зашел в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
180
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru