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

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

20.01.2012, 16:11. Показов 64997. Ответов 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
10.06.2013, 22:30
Студворк — интернет-сервис помощи студентам
raxp, приведенной прогой я тоже попробовал - на акустике (акустической гитаре) действительно 6я струна "видится" своей 2й гармоникой ). Но это "чудо" я бы отнес к свойствам самой гитары - дека по-видимому, рассчитана так, чтобы звучать в диапазоне чуть выше, чем 6я струна. Поэтому, именно дека звучит громче, на своей частоте.

Rem_, видел я ваши скрины. Просто ваши замеры нельзя назвать пока что сколько-нибудь представительными. Все познается, конеш, в сравнении, но... Какая у вас АЧХ микрофона, звуковой карты, всей системы в целом? Вы пробовали использовать разные источники звука, или только гитару? Как они себя проявляют?..

ЗЫ: указанные вами "хорошие" программы могут использовать обычный фильтр НЧ, который "поднимает низы", которые не могут быть получены среднестатистическим горе-микрофоном от караоке со звуковой картой за 3$. Так что вполне возможно, вы вообще не там ищете

Добавлено через 2 минуты
Цитата Сообщение от Rem_ Посмотреть сообщение
я беру её, значение слева, значение справа, отправляю в функцию для определения координат вершины параболы. вершина точнее показывает частоту.
кстати, а что за функция? Это ж у вас, похоже, не аппроксимация, а интерполяция? так она ж неправильно считает экстремум.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
10.06.2013, 22:54
Цитата Сообщение от Voland_ Посмотреть сообщение
не аппроксимация, а интерполяция? так она ж неправильно считает экстремум.
От вас совет, как считать правильно? То есть даже без гармоник, как точно определить вершину максимума?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
11.06.2013, 00:31
Rem_, берете неск.значений вокруг ожидаемого максимума, считаете билинейную аппроксимацию (ax2+bx+c) с помощью того же МНК, и считаете производную - (2ax+b = 0), приравняв ее к нулю получите перегиб. В итоге считаете точную частоту - x.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
12.06.2013, 09:59
вообще, параболическая интерполяция грубоватый метод, результаты по точности на троечку. Его преимущество в простоте реализации и быстроте работы. Недавно мне пришлось решать подобную задачу, только интерполировался не спектральный максимум, а окрестность пика ВКФ, но суть проблемы одинакова. АЦП работал на довольно низкой частоте дискретизации, а положение корреляционного пика нужно было получить с гораздо большей точностью, чем период дискретизации. Соответственно нужно было его интерполировать. И первое что попытались сделать - как раз интерполировать параболой. Результаты не порадовали. Интерполяция сплайнами давала значительно лучше результат, но это было слишком затратно для реализации на используемом проце. Решение оказалось неожиданно простым - использовать для интерполяции все то же fft! Выбиралась окрестность пика 16 точек, дополнялась нулями до 256 и ifft полученного фрейма возвращало передискретизированную в 16 раз последовательность. После сглаживания положение максимума в этом фрейме пересчитывалось на новой частоте дискретизации. Этот метод оказался достаточным по соотношению скорость/точность для реализации.
Другой вариант я уже излагал в этой же теме на несколько страниц раньше. Можно для точного определения положения спектральных максимумов использовать не fft( хотя это непривычно), а авторегрессионные методы.

Цитата Сообщение от Voland_ Посмотреть сообщение
Просто ваши замеры нельзя назвать пока что сколько-нибудь представительными. Все познается, конеш, в сравнении, но... Какая у вас АЧХ микрофона, звуковой карты, всей системы в целом? Вы пробовали использовать разные источники звука, или только гитару? Как они себя проявляют?..
Это все верно и уже обсуждалось выше, но автор почему то пропускает подобные замечания...
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
12.06.2013, 17:09
Цитата Сообщение от vital792 Посмотреть сообщение
параболическая интерполяция грубоватый метод
речь шла не об интерполяции, а аппроксимации. То есть предполагается, что мы берем не три точки, а штук 10 в окрестности.


Цитата Сообщение от vital792 Посмотреть сообщение
Выбиралась окрестность пика 16 точек, дополнялась нулями до 256 и ifft полученного фрейма возвращало передискретизированную в 16 раз последовательность
- очень здорово. Но ведь это просто полосовая фильтрация ) Вы просто притягиваете ожидаемый результат за уши, сознательно отрезая "незначимые" с вашей Т.З. гармоники. Но это ведь неправильно..
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
13.06.2013, 10:16
Цитата Сообщение от Voland_ Посмотреть сообщение
речь шла не об интерполяции, а аппроксимации.
речь шла об уточнении положения максимума в некой последовательности. То есть именно об интерполяции. Ведь нам нужна именно точка на более мелкой сетке, а не функция. Так что в этом бессмысленном терминологическом споре понятие интерполяция более корректно.

Цитата Сообщение от Voland_ Посмотреть сообщение
То есть предполагается, что мы берем не три точки, а штук 10 в окрестности.
я говорил о выборке в 16 точек вокруг максимума. Именно на этом фрагменте велась проверка

Цитата Сообщение от Voland_ Посмотреть сообщение
очень здорово. Но ведь это просто полосовая фильтрация )
Voland_, Вы вроде грамотный человек, а пишите такие вещи! ГДЕ тут полосовая фильтрация?? Никакой фильтрации тут вообще нет, в смысле фильтрации исходных данных. Я не отрезаю никакие гармоники, вообще ничего не отрезаю в исходном сигнале. Еще раз попробую описать метод. Берутся 16 точек из огибающей спектра в окрестности максимума. Эти 16 точек мне нужно интерполировать, чтобы получить промежуточные значения. В классическом варианте это делается так: между отсчетами вставляется необходимое количество нулей. Эта операция в частотной области "размножает" спектр, то есть получаются его сдвинутые копии на кратных частотах, количеством равным числу вставленных нулей. Это безобразие удаляется нч фильтром и получается передискретизированный в n раз сигнал, где n зависит от числа вставленных нулей. Я же выполняю эту же самую операцию сразу в частотной области. Дополняя исходную последовательность к фурье-образу огибающей нулями, я удаляю только эти сдвинутые копии, но никак не трогая исходные данные. То есть выполняется по сути классический ресэмплинг, только через fft
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
13.06.2013, 10:46
vital792, давайте "по Дерибасовской ходить постепенно... Позволю себе покопаться в постах, дабы рассуждать последовательно. Итак:

Цитата Сообщение от Voland_ Посмотреть сообщение
берете неск.значений вокруг ожидаемого максимума, считаете билинейную аппроксимацию (ax2+bx+c) с помощью того же МНК
Цитата Сообщение от vital792 Посмотреть сообщение
вообще, параболическая интерполяция грубоватый метод, результаты по точности на троечку.
Цитата Сообщение от Voland_ Посмотреть сообщение
речь шла не об интерполяции, а аппроксимации. То есть предполагается, что мы берем не три точки, а штук 10 в окрестности.
Аппроксимация (параболическая ли, или полиномиальная, в общем случае) дает возможность по-простому вычислить производную (алгебраически), и, приравняв ее к нулю, вычислить алгебраически (а не методом последовательных приближений и т.д.) точное положение перегиба - в нашем случае - максимума. А способы построения аппроксимации - МНК или еще что-то, дают отличную возможность "размазать ответственности за погрешности" вычисления того или иного компонента тренда. Потому что это статистический подход анализа данных.
А любая интерполяция, обязана проходить через все точки измеренных величин, посему, имхо, не имеет преимуществ в контексте данной задачи.

По поводу вашего решения - признаю, я сначала не понял ваше решение. Спутало вот это:
Сначала вы пишете:
Цитата Сообщение от vital792 Посмотреть сообщение
Я не отрезаю никакие гармоники, вообще ничего не отрезаю в исходном сигнале
а потом вдруг
Цитата Сообщение от vital792 Посмотреть сообщение
Берутся 16 точек из огибающей спектра в окрестности максимума.
а потом еще и обработка результатов интерполяции НЧ-фильтром.

То есть подход-то хороший, но чуйка такая, что вы
Цитата Сообщение от Voland_ Посмотреть сообщение
сознательно отрезая "незначимые" с вашей Т.З. гармоники. Но это ведь неправильно..
Ведь вы сознательно отбрасываете якобы ненужную информацию (о гармониках выше искомой), а ведь в ней могут храниться множество полезных данных, в частности данные о девиации частоты, ее дисперсии и т.д. Поправьте меня, если это не так.
1
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
13.06.2013, 11:18
Цитата Сообщение от Voland_ Посмотреть сообщение
Сначала вы пишете:
Сообщение от vital792 Я не отрезаю никакие гармоники, вообще ничего не отрезаю в исходном сигнале а потом вдруг
Сообщение от vital792 Берутся 16 точек из огибающей спектра в окрестности максимума. а потом еще и обработка результатов интерполяции НЧ-фильтром.
теперь я понял что Вас смутило. Эта обработка - маленькая подзадача "детализации" отдельно взятого фрагмента. И в рамках этой подзадачи остальная часть спектра нам не интересна, мы ее не рассмотриваем, но при этом ничего не выбрасываем. Все остается на своих местах, ничего из исходного сигнала не теряется.

Цитата Сообщение от Voland_ Посмотреть сообщение
Ведь вы сознательно отбрасываете якобы ненужную информацию (о гармониках выше искомой), а ведь в ней могут храниться множество полезных данных
нет, в данном случае отбрасываются искуственно созданные гармоники, не относящиеся к исходному сигналу, а появляющиеся в результате обработки
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
13.06.2013, 11:30
vital792, тут я с вами согласен. Для вашей задачи это, возможно, имеет больший смысл. Но для ТС можно попробовать и то и другое, ваш подход просто чуть сложнее.

ЗЫ: к слову, он вообще ушел в глухую оборону.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
15.06.2013, 23:52
Я разбираться пытаюсь, туговато.
http://miracle.otago.ac.nz/pos... nload.html
http://miracle.otago.ac.nz/pos... 1.2.tar.gz
Вот тартини исходники. Скачал, открыл, и смотрю как на новые ворота. Где тут код, отвечающий за весь процесс анализа ноты в звуке?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
16.06.2013, 00:46
...вы ваши "звуки" приложите к теме?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
16.06.2013, 01:11
Цитата Сообщение от Rem_ Посмотреть сообщение
Проблема именно на басах.
А ты не думаешь что у тебя микрофон /звуковуха басы валит?
для начала промерял бы АЧХ тракта
а для решения проблемы
вот что я думаю
звук музыкального инструмента состоит из основного тона (1 гармоника) и субтонов( другие гармоники)
например звук рояля очень близок к меандру сумма нечетных гармоник 1 3 5 7 .....
а при ударе по барабану сначала максимальными будут высшие гармоноки (ступенчатое нарастание сигнала)
тоже происходит при ударе(не щипке) по струне
очень хорошо слышно при игре на бас гитаре
сначала идет "бзинь" а потом "уууу"
бзинь это и есть высшие гармоники

гармоники всегда выше чем основной тон
следовательно нужно искать не максимум а минимальную частоту это и будет основной тон
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
16.06.2013, 15:29
Цитата Сообщение от ValeryS Посмотреть сообщение
минимальную частоту это и будет основной тон
минимальная частота по какому условию?
При чём тут мои звуки, гитара, микрофон? Нужен алгоритм (еще лучше рабочий код) чтоб работало на миллионе разных гитар и синтезаторов. (будет возможность, запишу выложу). Хотя я бы на комп форуме попросил помощи разобраться в исходниках открытой программы.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
16.06.2013, 15:50
Цитата Сообщение от Rem_ Посмотреть сообщение
минимальная частота по какому условию?
Да по любому
Есть тон(это самая нижняя частота)
Есть обертона (они всегда выше)
значит нужно чтобы найти тон нужно найти самую нижнюю частоту
или ты хочешь не чистую ноту играть а музыку
и чтобы программа тебе раскидала ноты(а ля сольфеджио)?
Такого я не видел

Цитата Сообщение от Rem_ Посмотреть сообщение
При чём тут мои звуки, гитара, микрофон?
при том что АЧХ не линейна
и если будешь ловить максимумы то получишь
Цитата Сообщение от Rem_ Посмотреть сообщение
Пятая струна имеет частоту 110 герц, но при дёргании программа распознаёт её как 220 гц.
вторая гармоника громче первой из за нелинейности АЧХ тракта гитара-микрофон-звуковуха

Цитата Сообщение от Rem_ Посмотреть сообщение
Нужен алгоритм (еще лучше рабочий код) чтоб работало на миллионе разных гитар и синтезаторов. (будет возможность, запишу выложу).
алгоритм такой(не компьютерный)
видел как звуковики прокачивают зал?

сначала подается белый шум
по нему настраивают тракт
и только после этого идет настройка
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
16.06.2013, 16:27
При чём тут мои звуки, гитара, микрофон?
про АЧХ вам уже сказали, но насчет звуков вы решили тупо игнорировать просьбы их выложить для анализа общественностью? Нехорошо. Вы ведь помощи просите, а не мы.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
16.06.2013, 16:33
как определить все обертона чтобы из них выбрать левый? как? алгоритм, код?
0
26 / 25 / 3
Регистрация: 22.01.2013
Сообщений: 273
25.06.2013, 16:00
Зачем что то придумывать - все уже известно - МАТЛАБ. Устанавливаете - звуковые файлы загружает стандартной функцией. Любой фильтр спроектировать 10 секунд, обработка любая - вейвлет и пр. пр. Запись опять в звуковой файл.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
25.06.2013, 17:08
тему пропустили? на лету нужно определить, файлы тут совсем ни при чём.
0
1022 / 157 / 10
Регистрация: 16.01.2013
Сообщений: 544
25.06.2013, 17:22
Так и на лету. Для определения частоты сигнала и его составляющих с точностью Δf необхоимо анализировать его на временном интервале Δt при этом Δf*Δt > 1
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
25.06.2013, 21:50
Вот так нормально? Ищем самую громкую частоту. Разница в частОтах зависит от размера буфера и частоты дискретизации.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (max_sample>0.2) // если аплтитуда мала, ничего не анализируем
        {
           CLEAR(Im);
            FFT(sampleBlock, Im, FRAMES_PER_BUFFER, POW_2, -1); // отправляем на БПФ
 
            max_ampl=0;
            max_i=0;
 
            for(i=0; i<FRAMES_PER_BUFFER/10; i++) // ищем максимальный вектор
            {
                len_vector=sampleBlock[i]*sampleBlock[i]+Im[i]*Im[i];
                if (len_vector>max_ampl)
                {
                    max_ampl=len_vector;
                    max_i=i;
                }
            }
            printf("max_i=%3i Freq= %4.2f  max_ampl= %8.3f\n",max_i,(float)max_i*SAMPLE_RATE/FRAMES_PER_BUFFER,sqrt(max_ampl)); // выводим частоту
        }
Добавлено через 4 часа 5 минут
Развитие мысли. Диапазон гитары умещается от 60 до 700 герц(по надобности можно изменить). Значит анализ спектра можно ограничить этими частотами.
C
1
2
3
4
5
int i_start=60*FRAMES_PER_BUFFER/SAMPLE_RATE;// нижняя частота
int i_last=700*FRAMES_PER_BUFFER/SAMPLE_RATE;// верхняя частота
...
for(i=i_start; i<i_last; i++) // ищем максимальный вектор в пределах диапазона
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2013, 21:50

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru