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

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

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

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

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

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

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

252
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.12.2013, 11:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от lavan Посмотреть сообщение
если я правильно понял то каждый элемент массива это значение частоты в момент времени?
Нет. Частота вообще не может быть в момент времени, а только за интервал. Каждый же элемент кодирует мгновенное значение звукового давления, то есть ординату точки графика волновой функции. Частота - это сколько раз временной интервал волновая функция имеет локальные максимумы, или локальные минимумы.

Добавлено через 2 минуты
Цитата Сообщение от lavan Посмотреть сообщение
2)что нужно сделать с этим массивом чтобы узнать ноту?
Каждой ноте соответствует некоторая частота основного тона и наоборот. Основной тон в музыке - это наименьшая из частот конкретного звука, на которую могут быть наложены гармоники более высоких частот. В радиосвязи, наоборот, низкие частоты модулирующего сигнала накладываются на высокую несущую частоту.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
05.12.2013, 18:25
Цитата Сообщение от taras atavin Посмотреть сообщение
это наименьшая из частот конкретного звука, на которую могут быть наложены гармоники более высоких частот
Вот я и пытаюсь придумал алгоритм такого поиска. Беда в том, что на басовых нотах хорошо слышны только гармоники. И какой уровень принять за основной? Всё что громче определенного уровня в спектре, подлежит анализу на поиск частоты. Так?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.12.2013, 18:26
Разве законченный Фурье даёт ни все частоты? Или проблема в том, что там ещё шум мешается?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
05.12.2013, 18:32
Даёт все, но основная нота это не максимальное значение в массиве.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
05.12.2013, 21:18
taras atavin, вы пролистайте тему с начала, мы по кругу пошли заново.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
16.12.2013, 18:52
Опять я. Задача изменилась.
Определить, есть ли в звуке (4096 семплов) открытая гитарная струна? Есть ли там одна из данных частот?
6 струна=82.41 Гц; 5=110 ; 4=147.82 ; 3=196 ; 2=246.94 ; 1=329.63
Использовать функцию автокорреляции. Где есть такая? Как я понял, для поиска звука 6 струны нужно график сдвинуть на (44100/82.41) = 535.13 семплов, и посчитать корреляционный коэффициент. Во-первых как сдвигать на дробное количество? Во-вторых как считается коэффициент?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
16.12.2013, 19:16
http://ru.wikipedia.org/wiki/А... ая_функция

открытая гитарная струна?
а что это вообще?

6 струна=82.41 Гц
...
сдвинуть на (44100/82.41) = 535.13 семплов
не сэмплов, а точек преобразования. Условно говоря, если через Фурье, то при 535 точках будет шаг 82.429 герца при частоте дискретизации 44100 Гц. И к тому же, откуда такая точность в частотах резонанса струны в сотые доли герца? Сдвигать и увеличивать количество точек преобразования можно добавлением нулей, это все уже обговаривалось.

А через корреляцию ознакомтесь с закрепленной темой Автокорреляционная функция и частота основного тона (ЧОТ)
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
16.12.2013, 19:23
Цитата Сообщение от raxp Посмотреть сообщение
открытая гитарная струна?
а что это вообще?
у гитары есть струны, как ни странно и их можно дёргать. Нужно определить, какую из них дёрнули.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
16.12.2013, 19:36
...схохмил, маладец. Лучше бы свою тему перечитал заново.
2
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
28.12.2013, 23:36
Так. Узнал новое. Есть алгоритм Герцеля - http://www.dsplib.ru/content/g... rtzel.html
Как я понял, он ищет величину мощности одной заданной частоты в сигнале (а не всех частот, как делает фурье)
Возможно в будущем приделаю его к контролю правильности игры заданной ноты или двух одновременно заданных нот.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
07.01.2014, 02:15
нашел иностранную статью с исходниками на гитхабе
http://blog.bjornroche.com/201... pitch.html
но заканчивается обычным magnitude[i] = sqrt( real[i]*real[i] + cmpx[i]*cmpx[i] ); без гармоник

Добавлено через 2 часа 57 минут
обалдеть. они там борятся с гармониками в самом начале! Low-Pass Filtering - берет среднее между двумя семплами, убирая таким образом резкие скачки и высшие частоты. Подскажите, что есть на эту тему?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
07.01.2014, 05:25
Если вы были внимательными, то про наложение окон до FFT уже вам говорил, то что они делают является частным случаем скользящего среднего, т.е. ФНЧ. Еще есть полиномы регрессии и сглаживания.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
05.02.2014, 17:49
Приделал фильтр на основе скользящего среднего. Захват, фильтр, окно, фурье, поиск максимума.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void SimpleMA(float *buf_1, int buf_size, int window)
{
    int i;
    float buf_2[buf_size];
    float sum=0;
    // начальные данные
    for (i=0; i<window; i++)
    {
        sum+=buf_1[i];
        buf_2[i]=sum/(i+1);
    }
    //основной буфер
    for (i=window; i<buf_size; i++)
    {
        sum-=buf_1[i-window]; // рекурентно, вычитаем старое значение
        sum+=buf_1[i]; // прибавляем новое
        buf_2[i]=sum/window;
    }
 
    for (i=0; i<buf_size; i++) buf_1[i]=buf_2[i];
}
Голос определяет отлично (скрин). С гитарой не очень, будем думать.
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 11
26.04.2014, 05:49
Занимаюсь сейчас такой же задачей.
попробовал FFT + HPS. HPS - это сжатие спектра в 1, 2, 3, 4.. раз в зависимости от того сколько гармоник в нем может находится, затем перемножение полученных сжатых спектров между собой, и обычный поиск максимума. Теоретически гармоники должны наложиться на фундаментальную частоту и в результате получится один большой жирный пик.

Проблема в том что он плохо работает с низкими частотами, у меня получалось вместо одного пика, несколько, я пробовал брать минимальный, и это сносно работало, на при записи с компьютера, где много шумов -- результаты намного хуже. Хотя с высокими работает отлично.
вот тут http://www.hjortgaard.net/projects/4/download
Для низких частот советуют использовать Cepstrum
Кто что может посоветовать? Если можно, есть ссылки на реализации Cepstrum, то это очень бы помогло(насколько я понимаю там используется обратное преобразование фурье IDFT, исходники или псевдокод были бы кстати)
Кстати кто что думает про метод автокорреляции http://cnx.org/content/m11714/latest/
Я не уверен стоит ли с ним вообще возится, судя из описания там вычислительная сложность намного больше, но в любом случае код-псевдокод, нормальное детальное описание помогли бы.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
26.04.2014, 10:04
Если бы вы внимательно ознакомились с темой, то увидели бы это, а также то, что вопрос уже рассматривался:
Вложения
Тип файла: pdf A_Smarter_Way_to_Find_Pitch.pdf (158.9 Кб, 13 просмотров)
Тип файла: pdf Philip_McLeod_PhD.pdf (2.70 Мб, 3 просмотров)
Тип файла: pdf Visualization_of_Musical_Pitch.pdf (343.6 Кб, 8 просмотров)
1
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
26.04.2014, 11:36
Вопрос с определением басовых нот по нормальному у меня не решён. Актуален до сих пор.
Автокорреляцию использовать нужно тогда, когда нужно распознать одну из небольшого количества нот. Потому что запускать функцию приходится на каждую распознаваемую ноту.
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 11
29.04.2014, 04:27
Попробовал кепструм. Резульаты еще хуже чем от HPS , лагает как на высоких так и на низких частотах, причем ошибки не зависят напрямую от частоты. Возможно я где то ошибся или сам алгоритм не подходит, хотя странно.
Значит я использовал следующий алгоритм
x = Hamming(x), x - амплитуды
y = FFT(x, N), N - размер окна, y - вещественная часть преобразования
y = log(abs(y)) - от модуля каждого элемента берется логарифм
x_c = IFFT(y) - обратное преобразование для y, мнимую часть, которая появилась при FFT(x, N) обнулил
f0 = SAMPLE_RATE / max_i(x_c) - частоту дескритизации делим на номер найденного максимального элемента
Кто что может посоветовать? Пока что буду пробовать автокорреляцию
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
09.05.2014, 13:20
Всё что смог наизобретать выложил тут https://github.com/Remeslennik... ndAnalyzer
Как распознавать басы - вопрос открытый. Кто сможет, подскажите что-нибудь.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
09.05.2014, 14:31
Цитата Сообщение от bobrokrol Посмотреть сообщение
Теоретически гармоники должны наложиться на фундаментальную частоту и в результате получится один большой жирный пик.
...И для баса тоже.
Вместо "наложения" гармоник друг на друга нужно высчитать соотношение между ними(Т.е делить на предыдущую гармонику ). В результате получим приблизительно 1/2, 1/3, 1/4 и тд.
Очень часто октавная гармоника громче тоники, а 3я гармоника может быть тише 4ой и тд, но соотношение между ними всегда укажет на тонику. Анализ самых громких 5-7 значений Magnitude дает практически безошибочный результат.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
09.05.2014, 15:00
Хм. То есть предлагаешь сначала искать все громкие частоты?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2014, 15:00

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru