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

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

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

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

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

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

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

252
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.05.2014, 12:24
Студворк — интернет-сервис помощи студентам
Ещё один скрин. Буква А простая разговорная и громкая. Самая сильная частота 220*6=1320 шестая гармоника!
На акустике 1 струна 19 лад примерно 1000Гц. Других инструментов нет, чтоб проверить диапазон на высоких нотах.
Считаю, что если найдём способ поиска основной частоты на основе шести гармоник (даже если основная частота очень тихая и её почти не слышно), то программа будет правильно анализировать любой звук.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
14.05.2014, 15:43
Rem
Я думаю, следует использовать самую громкую гармонику, как исходную, и уже от нее высчитывать гармоническое соотношение( касается определения основного тона музыкальных инструментов ).
В музыкальном( одна нота ) монофоническом сигнале гармоники следуют друг за другом в следующем порядке:
220, 440, 660, 880 ( те [2/1, 3/2, 4/3] или [2, 1.5, 1.(3) 1.25] и тд )
Например, если поделить частоту следующей за самой громкой гармоникой на самую громкую получим 660/440 =1.5, и далее 880/660= 1.(3), следовательно основной тон - 220Hz. Но окончательный решение следует принимать проанализировав 5-7 гармоник относительно самой громкой.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.05.2014, 16:19
Не понял. Что в коде писать?
Вот нашли мы F=1320. Можем найти F/2=660. F/3=440. F/4=330. F/5=264. F/6=220 и их значения.
Или искать все пики которые есть в спектре, потом их частоты, и их сравнивать?
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
14.05.2014, 16:30
Rem
Вот именно по этой причине я предлагал работу с файлом.
Нужна информация FFT магнитуд дальше от самой громкой.
Если оновной тон и есть 1320Hz значит 1320*2= 2640 1я гармоника, 2640*1.5= 3960Hz -2я и тд.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.05.2014, 16:37
Нет. Есть самая громкая частота 1320. И ОНА является гармоникой неизвестного порядка какой-то другой неизвестной частоты.
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 11
14.05.2014, 17:44
Цитата Сообщение от Rem_ Посмотреть сообщение
Не понял. Что в коде писать?
Вот нашли мы F=1320. Можем найти F/2=660. F/3=440. F/4=330. F/5=264. F/6=220 и их значения.
Или искать все пики которые есть в спектре, потом их частоты, и их сравнивать?
Самый большой пик не обязательно является гармоникой фундаментальной частоты. Мне кажется эта тема пошла по 3-му циклу.
Вот пример - нота с5, максимальный пик на G6. У G6 видна своя гармоника G7. Но это тот случай, когда HPS справляется, так как гармоник c5 много, и сами пики высокие.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
14.05.2014, 17:50
Как скажешь Rem. Я ведь понятия не имею какой именно ты сигнал анализируешь. Но думаю врядли данный алгоритм "сработает" в случае речевого опознания.

Добавлено через 4 минуты
bobrokrol
Я думаю, следует использовать самую громкую гармонику, как исходную, и уже от нее высчитывать гармоническое соотношение( касается определения основного тона музыкальных инструментов ).
В музыкальном( одна нота ) монофоническом сигнале гармоники следуют друг за другом в следующем порядке:
220, 440, 660, 880 ( те [2/1, 3/2, 4/3] или [2, 1.5, 1.(3) 1.25] и тд )
Например, если поделить частоту следующей за самой громкой гармоникой на самую громкую получим 660/440 =1.5, и далее 880/660= 1.(3), следовательно основной тон - 220Hz. Но окончательный решение следует принимать проанализировав 5-7 гармоник относительно самой громкой.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.05.2014, 18:12
Если звучит одна нота, то громкая частота обязательно является гармоникой.
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 11
14.05.2014, 18:18
Можно на конкретном примере с картинки. Я не понимаю зачем мне коэффициенты, я и так знаю все гармоники любой ноты. У меня есть массив пиков, я для каждой ноты, которая соответствует пику могу узнать все ее возможные гармоники. Как мне получить фундаментальную
С5 523
С6 1040
G6 1560 - самая громкая
C7 2100
E7 2637
G7 3135
[A7,A#7] - 3690
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.05.2014, 18:48
Всё правильно. Самая громкая G6 это третья гармоника ноты C6. 1560 = 520 * 3
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
14.05.2014, 18:56
Такое впечатление будто я китайским изъясняюсь...
Основной тон - 523
3135/2637= 1,18( округляем 1.2 ) 6/5
2637/2100= 1,25 5/4
2100/1560 = 1,34 ( 1,(3) ) 4/3
и тд
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.05.2014, 19:26
Глазами всё видно. Как алгоритм реализовать?
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
14.05.2014, 23:40
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Массив с частотами гармоник
aFq= [ 523.0, 1040.0, 1560.0, 2100.0, 2637.0, 3135.0, 3657 ]
# Массив для вычисления гармонических коэффициентов предыдущего массива.
aCoeff= []
# Эталонный массив коэффициентов.
aPrime= [ 2.0, 1.5, 1.33, 1.25, 1.2, 1.166  ]
 
 
# Раcчитываем гармонические коэффициенты
i = 0; while i< aFq.size-1 do
        aCoeff[i]= (aFq[i+1]/aFq[i]).round(2) # округление до 2го знака
i+= 1
end
# Результат: aCoeff= [ 1.99, 1.5, 1.35, 1.26, 1.19, 1.17 ]
 
 
# Высчитываем схожесть
sum= 0
for i in 0..aPrime.size-1 do
    sum+=( aCoeff[i] -aPrime[i] ).abs
end
err= sum.round(3)
# err - это погрешность( 0,054 ).
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
15.05.2014, 05:21
Скопипастил. 2.5 Choosing the Fundamental
Кликните здесь для просмотра всего текста

http://miracle.otago.ac.nz/tar... _Pitch.pdf

2.5 Choosing the Fundamental

After the frequencies of all the local maxima have been found, their amplitudes are calculated. The strongest frequency is selected and assumed to be one of the harmonics from the note being played. The fundamental is not always the strongest frequency in a note. Figure 4 shows an example of a note where the fifth harmonic is the most powerful.

Firstly we pick out the frequency , F, with the largest amplitude. This is almost certainly a true harmonic of the fundamental we are seeking. In other words, the fundamental frequency is F = f/n where n is an integer . For each value of n from one to ten we examine the spectrum to see how many frequencies are potential harmonics of F.

A frequency is a potential harmonic if it is close the ideal frequency of the harmonic. We actually calculate a score for each F=f/n which is a weighted sum of closeness measures. The more peaks that are separated by F the better the fit.

We have tested various measures of closeness and their combinations. For example, if the difference of two potential harmonics is very close to F, this is good evidence that F is the correct fundamental even if the potential harmonics are not exact multiples of F. We are still refining it.

Basically this process works like a voting scheme. The “frequency differences between peaks” vote for how well they fit each of the proposed fundamental frequencies (using Gaussian drop off). The strength of their votes is based on the square of the constituent amplitudes (in dB). The votes are then normalised by dividing by the total number of possible votes. The fundamental with the highest number of votes is chosen as the pitch of the note. The output from this stage is a good approximation to the pitch of the note which can be displayed.
1
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
15.05.2014, 16:01
Функция для получения присутствующих гармоник:
Кликните здесь для просмотра всего текста

C
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
float GetFreqHarm(float *Rdat, float *Idat, int N)
{
    int i=0, j=0;
    int i_start=60*FRAMES_PER_BUFFER/SAMPLE_RATE;// нижняя частота, примерный диапазон гитары
    int i_last=2000*FRAMES_PER_BUFFER/SAMPLE_RATE;// верхняя частота
    float PowFreq[FRAMES_PER_BUFFER];
 
    for(i=i_start; i<i_last; i++) PowFreq[i]= sqrt (Rdat[i]*Rdat[i]+Idat[i]*Idat[i]); //спектр
    // обнуляем частоты и координаты
    for (i=0; i<10; i++)
    {
        X0_COORD[i]=0;
        Y0_COORD[i]=0;
        Frequency[i]=0;
 
    }
    // ищем локальные максимумы
    for(i=i_start; i<i_last; i++)
    {
        // если слева и справа ниже, ищем вершину параболы
        if (PowFreq[i] >10 && PowFreq[i-1]<PowFreq[i] && PowFreq[i+1]<PowFreq[i])
        {
            VertexPar((float)i-1, // левая точка
                      PowFreq[i-1],
                      (float)i, // средняя точка
                      PowFreq[i],
                      (float)i+1, // правая точка
                      PowFreq[i+1],
                      j); // счетчик вершин
            // вершины в частоты
            Frequency[j] = X0_COORD[j]*SAMPLE_RATE/FRAMES_PER_BUFFER;
            j++;
        }
    }
    //получили массив вершин, выводим на печать
    if (Frequency[0]!=0) // если есть звук
    {
        printf("\n");
        for (j=0; j<10; j++)
        {
            if (Frequency[j]!=0) // напечатать вершины и частоты
            {
                printf("X0 %i=%.2f  " , j, X0_COORD[j]);
                printf("Freq%i = %.2f  " , j, Frequency[j]);
                printf("Y0 %i = %.0f" , j, Y0_COORD[j]);
                printf("\n");
            }
        }
    }
    return 0;
}

Ловит все лепестки. Букву беру ради сложного сигнала. Гитара на самом деле даёт три-четыре лепестка. (Уже думаю, а не брать ли просто самую левую гармонику? И проверять, кратна ли она самой громкой). На график попробую вывести все оранжевые полоски на всех участках.
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 11
15.05.2014, 18:44
Цитата Сообщение от Rem_ Посмотреть сообщение
Всё правильно. Самая громкая G6 это третья гармоника ноты C6. 1560 = 520 * 3
Да согласен, это я что-то перемудрил. Негармонические обертоны возможны(например звук колокольчика), но это не мой случай. Попробую реализовать проверку пиков так как Вы писали. Сейчас еще возник вопрос как лучше находить гауссианы? Я просто проверяю что две производные слева больше нуля, а две справа меньше, и таким способом нахожу пики. Ограничиваю минимальную высоту пика как Const * (Sum(все значения магнитуд кроме максимальной) / N -1), Const = 3. Я думаю есть более умные способы. Метод градиентного спуска нет смысла применять, там и так все пики выпуклые.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
15.05.2014, 19:21
bobrokrol,
меня вот все интересует о каких
Цитата Сообщение от bobrokrol Посмотреть сообщение
магнитуд
ты все говоришь?

Цитата Сообщение от bobrokrol Посмотреть сообщение
Негармонические обертоны возможны
переведи пожалуйста?

обертон это и есть гармоника

Добавлено через 3 минуты
Цитата Сообщение от Rem_ Посмотреть сообщение
Уже думаю, а не брать ли просто самую левую гармонику? И проверять, кратна ли она самой громкой
я тебе про это уже две страницы назад говорил
Цитата Сообщение от ValeryS Посмотреть сообщение
можно попробовать взять самую низкую частоту, это должна быть основная
потом следующую если кратна низкой то это её гармоника если нет это другая нота
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
15.05.2014, 21:23
Если басовые ноты играть на синтезаторе, ниже диапазона гитары, то основной тон будет не слышен. Поэтому нужно будет ловить гармоники.

Добавлено через 1 час 34 минуты
Поступила идея - искать разницу между частотами, а не их отношения.
0
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 181
15.05.2014, 22:21
Цитата Сообщение от bobrokrol Посмотреть сообщение
Я просто проверяю что две производные слева больше нуля, а две справа меньше, и таким способом нахожу пики.
Откуда взят этот метод, если не секрет, и насколько он надежен?
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 11
16.05.2014, 19:36
Цитата Сообщение от ValeryS Посмотреть сообщение
bobrokrol,
меня вот все интересует о каких ты все говоришь?
переведи пожалуйста?
обертон это и есть гармоника
под "магнитудами" я понимаю модуль значений FFT = |FFT|. В англоязычных источниках это называется Magnitude
Обертоны могут быть негармоническими.
Inharmonic Spectrum of a Small Bell
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2014, 19:36

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

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

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

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

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


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

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