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

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

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

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

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

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

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

252
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
29.05.2013, 22:14
Студворк — интернет-сервис помощи студентам
ну в спектре (естественно, посчитанному не идеально), максимумов множество. Поэтому, имеет смысл идти по правильным частотам кратным и деленным на 2 в бОльшую сторону. Rem_, Вам нужен критерий, по которому вы будете идентифицировать конкретный пик. И я думаю, это как раз амплитуда, относительно соседних, не основных пиков. Как вариант - считаете среднюю амплитуду всех пиков, и если амплитуда найденного выше, то этот пик является "правильным".
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
30.05.2013, 10:23
Во, придумал. Сначала ищем максимум по диапазону. Потом ищем второй максимум от начала до первого максимума! И если они отличаются ровно в два раза, значит принимаем за ноту левый пик. Потом расскажу что получилось.

Добавлено через 1 час 39 минут
Нашел целые научные работы, посвященные нахождению точной ноты
http://miracle.otago.ac.nz/pos... apers.html
Одна из них как раз описывает теорию и использование в программе Tartini со скринами.
Philip McLeod, Fast, Accurate Pitch Detection Tools for Music Analysis, PhD thesis, Department of Computer Science, University of Otago, 2008. [PDF] (2.8Mb) http://miracle.otago.ac.nz/pos... od_PhD.pdf

Добавлено через 9 часов 45 минут
Как я понял, там используют SNAC функцию (4.1 Special Normalisation of the Autocorrelation
(SNAC) Function страница 45) А в пункте 4.3 стр.51 используют параболическую интерполяцию для нахождения координат истинного пика. Графики и использование нашел на 94 странице.
2
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
30.05.2013, 11:20
Цитата Сообщение от Rem_ Посмотреть сообщение
используют параболическую интерполяцию для нахождения координат истинного пика.
Хороший метод, проверенный. Но это только уточнение положения пика на спектре. Есть другой способ - использовать не fft, а другую, сглаженную спектральную оценку. Есть авторегрессионные методы (Берга, Юла-Уокера), метод music. Они для того и придумывались, чтобы получать несмещенные спектральные оценки, выделять истинные максимумы, а не частоты разложения fft. Вторая Ваша подзадача - выделение нужного максимума из серии гармоник более сложная, в некоторых случаях неразрешимая. Вообще странно, что максимум получается на октаву выше. Вы на реальном инструменте проверяете?
Алгоритм поиска я представляю себе примерно такой: Выбираете в огибающей спектра несколько максимумов (3-4). Проверяете частоты соответствующие этим пикам на кратность. Из тех что удовлетворяют, выбираете самый левый, причем надо еще ввести какой нибудь порог, ниже которого максимум не выбирать. Это так, набросок в первом приближении....
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
30.05.2013, 11:28
TC, потестируйте (смотреть параметры тона внизу):

(ищется максимум и его частота F0, потом все локальные экстремумы (перегибы) до него, далее частоты экстремумов сравниваются с F0/2 в районе +-5 герц)
Вложения
Тип файла: zip dtmfw2.zip (2.69 Мб, 29 просмотров)
1
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
30.05.2013, 11:35
Вообще странно, что максимум получается на октаву выше. Вы на реальном инструменте проверяете?
В этом и особенность реального звука от синтезированного. Колебания струны состоят из множества гармоник (на 3d очень хорошо видно). Попробую тогда так: определить максимальный пик, и проанализировать частоту ровно в два раза меньшую. Если она выделяется на фоне соседних частот (или громче определенного значения?), значит это нота. Если не выделяется, значит нота на максимальном пике.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
30.05.2013, 11:46
Цитата Сообщение от Rem_ Посмотреть сообщение
В этом и особенность реального звука от синтезированного.
Да это понятно, что гармоники должны быть. Но все таки максимум в спектре должен быть на основной частоте. Попробуете записать звук на разных октавах и посмотрите распределение спектральной плотности. И если возможно, выложите записи на форум, интересно посмотреть. И кстати, какой инструмент используется?
Цитата Сообщение от Rem_ Посмотреть сообщение
Попробую тогда так: определить максимальный пик, и проанализировать частоту ровно в два раза меньшую.
Это то самое, про что я писал выше - только с выбором порога не ясно - пожалуй подбором только
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
30.05.2013, 13:30
Всё ещё хуже Попробовал погудеть голосом около 110 гц (A). Здесь даже третья! гармоника громче всех.
Уж поймите меня правильно, но выкладывать всё нет смысла. Я играю на обычной старой акустической гитаре на ноутбуке через встроеный микрофон тут http://ispectrometer.com/ . Проблемы как раз около сотни герц начинаются, около 80 Гц уже совсем плохо определяет. На пианино и синтезаторах тоже басовые ноты должны быть тише гармоник, но их у меня нет.
Моя программа подтверждает, что максимумы периодически меняются по громкости. То одну частоту определит, то другую.
Миниатюры
Как узнать частоту звука?   Как узнать частоту звука?  
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
30.05.2013, 13:39
...если микрофон встроенный, то туда подмешиваются собственные резонансы корпуса ноута, стола и прочих окружающих предметов. Для гитары рекомендуется внешний микрофон или звукосниматель, займитесь этим, в сети множество рекомендаций.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
30.05.2013, 14:31
Алгоритмы тюнеров не зависят от микрофона, они нормально определяют ноту. Значит можно как-то сделать и на обычном.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
30.05.2013, 14:39
...тогда ройтесь в сорцах, уже говорил.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
31.05.2013, 13:32
Решил почитать и другие материалы про тартини.
http://miracle.otago.ac.nz/pos... _Pitch.pdf
2.1 Window Selection. Размер окна берут 2048, что при 44100 составляет примерно 1/20 секунды
2.2 Applying a Windowing Function. По краям сигнал делают тише, применяют кривую Гауса (есть графики)
2.3 Performing an FFT on Windowed Data. Создают спектр частот.
2.4 Finding Gaussian Peaks. На полученных частотных коэффициентах ищут формы похожие на кривые Гауса. На основании соседних точек определяется истинная вершина, истинная частота с высокой точностью. (Fig.3)
2.5 Choosing the Fundamental. Определяют основную частоту. Берут максимальную амплитуду из найденных, и проверяют, является ли она гармоникой более низкой частоты. На примере показано что самая сильная пятая гармоника.
2.6 Calculating Which Note on the Scale. Определяют ноту. n показывает, на сколько полутонов данная частота отстоит от нижней ноты на фортепиано (A0) Десятичная часть может использоваться для отображения отклонения от ноты в музыкальных центах. (Один полутон / 100 частей = 1 музыкальный цент)
Ну, покодим?
0
31.05.2013, 14:04

Не по теме:

...не, есть заказ, как нибудь сами.

0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
31.05.2013, 23:53
Так. Есть идея в спектре использовать не параболу, а искать фигуры похожие на кривую Гаусса, и вычислять координаты вершин. На одном спектре будет по несколько вершин, из них выберем самую громкую, и кратную ей минимальную.
Подскажите, как из массива найти пики Гаусса?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
06.06.2013, 18:00
Где моя тема?? Зачем стёрли?? Там же КОД был, там рассуждения были, алгоритмы готовые?!?
Верните пожалуйста. Обещаю в эту тему не влезать и сидеть в своей.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
06.06.2013, 22:50
Никто ничего не стирал, темы объединены. Прежде чем возмущаться, читайте правила, обсуждение в одном месте. Т.е. теперь тут. Точка.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
10.06.2013, 18:43
Ясно.
Проблема моего кода - определение двух громких гармоник. Она не работает, потому что на басовых струнах оригинальная нота тише целой кучи гармоник. В гауссах не понимаю, придумал вот что:
Как обычно ищется максимум из спектра, строится парабола, определяется положение вершины параболы. Теперь нужно анализировать частоту в двое меньше найденной. Если в этом месте есть пик спектра, значит реальную ноту принять именно в этом месте. (Если нет тут пика, значит максимальный и есть нота). Потом анализировать частоту в три раза меньше найденной. Если и в этом месте есть пик, значит тут находится действительная нота. Надо придумать алгоритм проверки, есть в заданном месте пик или нету.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.06.2013, 19:15
...как уже говорил, я проводил анализ следующим образом: идем по массиву точек (амплитуд) и находим максимальную, запоминаем номер этой гармоники и в следующем поиске ищем амплитуду от первой точки до номера этой гармоники-1, которая будет больше по амплитуде следующей точки+1 и больше предыдущей точки-1 - это и будут экстремумы. Далее я анализировал попадает ли текущий экстремум по частоте на половинную частоту, в вашем случае поиск продолжаем до третьей части максимальной гармоники по частоте.

Насчет параболы не понял конкретики.

Моя реализация в терминах Delphi (синтаксис от Си тут незначителен):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 // пытаемся найти частоту основного тона - максимум
  azero := -1;  temp_i:= 0;
  for i := length(outwav.dy) - 1 downto 0+1 do begin
    a := outwav.dy[i];
    f := i * cntval;
    if (a > azero) then begin azero := a; fzero := f; temp_i := i; end; //частота для 2-
  end;
  if fzero<>0 then begin
   a0 := azero; f0 := fzero;
  end;
 
  // =================================
  // пытаемся найти частоту основного тона -2
  // =================================
  azero := -1; fzero:= 0;
  i:= 1;
  // ищем второй максимум по гармонической частоте от 0+1 до первого максимума
  while i < temp_i do begin
    a:= outwav.dy[i];
    aminusodin:= outwav.dy[i-1];
    aplusodin := outwav.dy[i+1];
    f := i * cntval;
 
    // находим локальные экстремумы
    if (a > aminusodin)and(a > aplusodin) then begin
     // вводим погрешность в 5 герц +-
     if (f>(f0 / 2)-5)and(f<(f0 / 2)+5) then begin
      azero:= a;
      fzero:= f;
     end;
    end;
    i:= i +1;
   end;
  aos:= azero; fos:= fzero;
outwav.dy - cтруктура для набора амплитуд гармоник в спектре (по сути массив), cntval = header.nSamplesPerSec {44100} * header.nChannels / (2 * length(outwav.dy)).
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
10.06.2013, 19:30
Цитата Сообщение от raxp Посмотреть сообщение
Насчет параболы не понял конкретики.
я т.п., это методика аппроксимации спектра для уточнения перегиба по производной.

Rem_, а вы на 100% уверены, что таки гармоника звука больше, чем основной тон? Что-то слабо в это верится... Может, что-то в коэффициентах разложения не так? Дайте исходник звука в PCM.
ЗЫ: я представляю насколько усложнится в таком случае задача, когда вы захотите найти две струны по АЧХ ). Два закавыристых варианта - это взятая октава, и прима ).
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
10.06.2013, 21:43
Voland_, листайте тему, я скрины приводил. Проблема именно на басах. тут наглядно видно http://ispectrometer.com/
Парабола вот тут откуда: есть максимальная амплитуда, я беру её, значение слева, значение справа, отправляю в функцию для определения координат вершины параболы. вершина точнее показывает частоту.

Добавлено через 2 минуты
(скрины на 4 странице)
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.06.2013, 22:10
Rem_, но вы тоже полистайте, вас уже просили привести ваши звуковые файлы, которые вы анализируете, это совсем нетрудно - скрепочка в расширенном режиме в редакторе поста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2013, 22:10

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Часы электронные
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