Оценка основной частоты звукового сигнала
указывает параметры, использующие один или несколько f0 = pitch(audioIn,fs,Name,Value)Name,Value аргументы пары.
Считывание звукового сигнала. Звонить pitch для оценки фундаментальной частоты во времени.
[audioIn,fs] = audioread('Hey.ogg');
f0 = pitch(audioIn,fs);Прослушайте звуковой сигнал и постройте график сигнала и основного тона. pitch функция возвращает оценку основной частоты во времени, но оценка действительна только для гармонических областей.
sound(audioIn,fs) tiledlayout(2,1) nexttile plot(audioIn) xlabel('Sample Number') ylabel('Amplitude') nexttile plot(f0) xlabel('Frame Number') ylabel('Pitch (Hz)')

Считывайте аудиосигнал и извлекайте тон.
[x,fs] = audioread('singing-a-major.ogg'); t = (0:size(x,1)-1)/fs; winLength = round(0.05*fs); overlapLength = round(0.045*fs); [f0,idx] = pitch(x,fs,'Method','SRH','WindowLength',winLength,'OverlapLength',overlapLength); tf0 = idx/fs;
Прослушайте звук и постройте график оценок звука и основного тона.
sound(x,fs) figure tiledlayout(2,1) nexttile plot(t,x) ylabel('Amplitude') title('Audio Signal') axis tight nexttile plot(tf0,f0) xlabel('Time (s)') ylabel('Pitch (Hz)') title('Pitch Estimations') axis tight

pitch функция оценивает шаг для перекрывающихся окон анализа. Оценки основного тона действительны только в том случае, если окно анализа имеет гармоническую составляющую. Позвоните в harmonicRatio использование одного и того же окна и длины перекрытия, используемых для обнаружения основного тона. Постройте график отношения звука, основного тона и гармоник.
hr = harmonicRatio(x,fs,"Window",hamming(winLength,'periodic'),"OverlapLength",overlapLength); figure tiledlayout(3,1) nexttile plot(t,x) ylabel('Amplitude') title('Audio Signal') axis tight nexttile plot(tf0,f0) ylabel('Pitch (Hz)') title('Pitch Estimations') axis tight nexttile plot(tf0,hr) xlabel('Time (s)') ylabel('Ratio') title('Harmonic Ratio') axis tight

Используйте отношение гармоник в качестве порога для допустимых решений основного тона. Если гармоническое отношение меньше порогового значения, установите для решения о тоне значение NaN. Постройте график результатов.
threshold = 0.9; f0(hr < threshold) = nan; figure plot(tf0,f0) xlabel('Time (s)') ylabel('Pitch (Hz)') title('Pitch Estimations') grid on

Прочитайте в звуковом сигнале женского голоса, сказав «громкость выше» пять раз. Слушайте звук.
[femaleVoice,fs] = audioread('female-volume-up.ogg');
sound(femaleVoice,fs)Читать в аудиосигнале мужского голоса, говоря «громкость вверх» пять раз. Слушайте звук.
maleVoice = audioread('male-volume-up.ogg');
sound(maleVoice,fs)Извлеките шаг из женской и мужской записей. Построить гистограммы оценок основного тона для мужской и женской аудиозаписей. Гистограммы имеют схожую форму. Это происходит потому, что решения о тоне содержат результаты для невокализированной речи и областей молчания.
f0Female = pitch(femaleVoice,fs); f0Male = pitch(maleVoice,fs); figure numBins = 20; histogram(f0Female,numBins,"Normalization","probability"); hold on histogram(f0Male,numBins,"Normalization","probability"); legend('Female Voice','Male Voice') xlabel('Pitch (Hz)') ylabel('Probability') hold off

Используйте detectSpeech функция для выделения областей речи в аудиосигнале и затем извлечения основного тона только из этих областей речи.
speechIndices = detectSpeech(femaleVoice,fs); f0Female = []; for ii = 1:size(speechIndices,1) speechSegment = femaleVoice(speechIndices(ii,1):speechIndices(ii,2)); f0Female = [f0Female;pitch(speechSegment,fs)]; end speechIndices = detectSpeech(maleVoice,fs); f0Male = []; for ii = 1:size(speechIndices,1) speechSegment = maleVoice(speechIndices(ii,1):speechIndices(ii,2)); f0Male = [f0Male;pitch(speechSegment,fs)]; end
Построить гистограммы оценок основного тона для мужской и женской аудиозаписей. Распределения шага теперь отображаются так, как и ожидалось.
figure histogram(f0Female,numBins,"Normalization","probability"); hold on histogram(f0Male,numBins,"Normalization","probability"); legend('Female Voice','Male Voice') xlabel('Pitch (Hz)') ylabel('Probability')

Загрузите аудиофайл введения Für Elise и частоту дискретизации звука.
load FurElise.mat song fs sound(song,fs)
Позвоните в pitch функция с помощью фильтра оценки тангажа (PEF), диапазон поиска от 50 до 800 Гц, длительность окна 80 мс, длительность перекрытия 70 мс и средняя длина фильтра 10. Постройте график результатов.
method ="PEF"; range = [
50,
800]; % hertz winDur =
0.08; % seconds overlapDur =
0.07; % seconds medFiltLength =
10; % frames winLength = round(winDur*fs); overlapLength = round(overlapDur*fs); [f0,loc] = pitch(song,fs, ... 'Method',method, ... 'Range',range, ... 'WindowLength',winLength, ... 'OverlapLength',overlapLength, ... "MedianFilterLength",medFiltLength); t = loc/fs; plot(t,f0) ylabel('Pitch (Hz)') xlabel('Time (s)') grid on

Создать dsp.AudioFileReader объект для чтения в аудио покадровом режиме.
fileReader = dsp.AudioFileReader('singing-a-major.ogg');Создать voiceActivityDetector обеспечение возможности обнаружения наличия голоса в потоковом аудио.
VAD = voiceActivityDetector;
Пока есть непрочитанные выборки, считайте из файла и определите вероятность того, что кадр содержит голосовую активность. Если кадр содержит речевую активность, выполните вызов pitch для оценки основной частоты звукового кадра. Если кадр не содержит речевой активности, объявите основную частоту как NaN.
f0 = []; while ~isDone(fileReader) x = fileReader(); if VAD(x) > 0.99 decision = pitch(x,fileReader.SampleRate, ... "WindowLength",size(x,1), ... "OverlapLength",0, ... "Range",[200,340]); else decision = NaN; end f0 = [f0;decision]; end
Постройте график обнаруженного контура основного тона во времени.
t = linspace(0,(length(f0)*fileReader.SamplesPerFrame)/fileReader.SampleRate,length(f0)); plot(t,f0) ylabel('Fundamental Frequency (Hz)') xlabel('Time (s)') grid on

Различные способы оценки основного тона обеспечивают компромиссы с точки зрения устойчивости к шуму, точности, оптимального запаздывания и затрат на вычисления. В этом примере сравнивается производительность различных алгоритмов обнаружения основного тона с точки зрения полной ошибки основного тона (GPE) и времени вычисления при различных условиях шума.
Подготовка тестовых сигналов
Загрузите аудиофайл и определите количество его образцов. Также загрузите истинный шаг, соответствующий аудиофайлу. Истинный шаг был определен как среднее из нескольких сторонних алгоритмов в файле чистой речи.
[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav'); numSamples = size(audioIn,1); load TruePitch.mat truePitch
Создание тестовых сигналов путем добавления шума к звуковому сигналу в заданных SNR. mixSNR функция является функцией удобства, локальной для этого примера, которая принимает сигнал, шум и запрошенное SNR и возвращает шумный сигнал по запросу SNR.
testSignals = zeros(numSamples,4); turbine = audioread('Turbine-16-44p1-mono-22secs.wav'); testSignals(:,1) = mixSNR(audioIn,turbine,20); testSignals(:,2) = mixSNR(audioIn,turbine,0); whiteNoiseMaker = dsp.ColoredNoise('Color','white','SamplesPerFrame',size(audioIn,1)); testSignals(:,3) = mixSNR(audioIn,whiteNoiseMaker(),20); testSignals(:,4) = mixSNR(audioIn,whiteNoiseMaker(),0);
Сохраните шумовые условия и имена алгоритмов в виде массивов ячеек для маркировки и индексирования.
noiseConditions = {'Turbine (20 dB)','Turbine (0 dB)','WhiteNoise (20 dB)','WhiteNoise (0 dB)'};
algorithms = {'NCF','PEF','CEP','LHS','SRH'};Выполнить алгоритмы определения шага
Предварительно распределить массивы для хранения решений основного тона для каждого алгоритма и пары условий шума и информации синхронизации. В цикле вызовите pitch функция на каждой комбинации алгоритма и шумового состояния. Каждый алгоритм имеет оптимальную длину окна, связанную с ним. В этом примере для простоты используется длина окна по умолчанию для всех алгоритмов. Используйте 3-элементный медианный фильтр для сглаживания решений о тангаже.
f0 = zeros(numel(truePitch),numel(algorithms),numel(noiseConditions)); algorithmTimer = zeros(numel(noiseConditions),numel(algorithms)); for k = 1:numel(noiseConditions) x = testSignals(:,k); for i = 1:numel(algorithms) tic f0temp = pitch(x,fs, ... 'Range',[50 300], ... 'Method',algorithms{i}, ... 'MedianFilterLength',3); algorithmTimer(k,i) = toc; f0(1:max(numel(f0temp),numel(truePitch)),i,k) = f0temp; end end
Сравнить общую ошибку шага
Грубая ошибка основного тона (GPE) является популярной метрикой при сравнении алгоритмов обнаружения основного тона. ГПЭ определяется как доля решений основного тона, для которых относительная ошибка выше заданного порога, традиционно 20% в исследованиях речи. Вычислите GPE и распечатайте его в окне команд.
idxToCompare = ~isnan(truePitch); truePitch = truePitch(idxToCompare); f0 = f0(idxToCompare,:,:); p = 0.20; GPE = mean( abs(f0(1:numel(truePitch),:,:) - truePitch) > truePitch.*p).*100; for ik = 1:numel(noiseConditions) fprintf('\nGPE (p = %0.2f), Noise = %s.\n',p,noiseConditions{ik}); for i = 1:size(GPE,2) fprintf('- %s : %0.1f %%\n',algorithms{i},GPE(1,i,ik)) end end
GPE (p = 0.20), Noise = Turbine (20 dB).
- NCF : 0.9 % - PEF : 0.4 % - CEP : 8.2 % - LHS : 8.2 % - SRH : 6.0 %
GPE (p = 0.20), Noise = Turbine (0 dB).
- NCF : 5.6 % - PEF : 24.5 % - CEP : 11.6 % - LHS : 9.4 % - SRH : 46.8 %
GPE (p = 0.20), Noise = WhiteNoise (20 dB).
- NCF : 0.9 % - PEF : 0.0 % - CEP : 12.9 % - LHS : 6.9 % - SRH : 2.6 %
GPE (p = 0.20), Noise = WhiteNoise (0 dB).
- NCF : 0.4 % - PEF : 0.0 % - CEP : 23.6 % - LHS : 7.3 % - SRH : 1.7 %
Рассчитайте среднее время обработки одной секунды данных для каждого из алгоритмов и распечатайте результаты.
aT = sum(algorithmTimer)./((numSamples/fs)*numel(noiseConditions)); for ik = 1:numel(algorithms) fprintf('- %s : %0.3f (s)\n',algorithms{ik},aT(ik)) end
- NCF : 0.021 (s) - PEF : 0.080 (s) - CEP : 0.018 (s) - LHS : 0.028 (s) - SRH : 0.067 (s)
audioIn - Звуковой входной сигналВходной аудиосигнал, заданный как вектор или матрица. Столбцы матрицы обрабатываются как отдельные аудиоканалы.
Типы данных: single | double
fs - Частота дискретизации (Гц)Частота дискретизации входного сигнала в Гц, заданная как положительный скаляр.
Частота выборки должна быть больше или равна удвоенной верхней границе диапазона поиска. Укажите диапазон поиска с помощью Range пара имя-значение.
Типы данных: single | double
Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.
pitch(audioIn,fs,'Range',[50,150],'Method','PEF')'Range' - Диапазон поиска оценок основного тона[50,400] (по умолчанию) | двухэлементный вектор строки с увеличением положительных целых значенийДиапазон поиска оценок основного тона, определяемый как разделенная запятыми пара, состоящая из «Range» и двухэлементного вектора строки с возрастающими положительными целыми значениями. Функция ищет наилучшую оценку основной частоты в пределах верхнего и нижнего краев полосы, заданных вектором, согласно алгоритму, заданному Method. Диапазон - включительно, единицы измерения - в Гц.
Допустимые значения для диапазона поиска зависят от частоты выборки, fs, и о значениях WindowLength и Method:
| Метод | Минимальный диапазон | Максимальный диапазон |
|---|---|---|
'NCF' | | Range(2) < |
'PEF' | 10 < Range(1) | Range(2) < min(4000, |
'CEP' | | Range(2) < |
'LHS' | 1 < Range(1) | Range(2) < |
'SRH' | 1 < Range(1) | Range(2) < |
Типы данных: single | double
'WindowLength' - Количество проб в окне анализаround(fs*0.052) (по умолчанию) | целое числоКоличество выборок в окне анализа, указанное как разделенная запятыми пара, состоящая из 'WindowLength'и целое число в диапазоне [1, мин (размер (audioIn,1), 192000)]. Типичные окна анализа находятся в диапазоне 20-100 мс. Длина окна по умолчанию составляет 52 мс.
Типы данных: single | double
'OverlapLength' - Количество образцов перекрытия между соседними окнами анализаround(fs*0.042) (по умолчанию) | целое числоЧисло выборок перекрытия между соседними окнами анализа, указанное как разделенная запятыми пара, состоящая из 'OverlapLength'и целое число в диапазоне (-inf,WindowLength). Отрицательная длина перекрытия указывает на неперекрывающиеся окна анализа.
Типы данных: single | double
'Method' - Метод, используемый для оценки шага'NCF' (по умолчанию) | 'PEF' | 'CEP' | 'LHS' | 'SRH'Метод, используемый для оценки основного тона, указанного как разделенная запятыми пара, состоящая из 'Method«и» 'NCF', 'PEF','CEP', 'LHS', или 'SRH'. Различные способы вычисления основного тона обеспечивают компромиссы с точки зрения устойчивости к шуму, точности и затрат на вычисления. Алгоритмы, используемые для вычисления основного тона, основаны на следующих работах:
Типы данных: char | string
'MedianFilterLength' - Медианная длина фильтра, используемая для сглаживания оценок основного тона во времени1 (по умолчанию) | положительное целое числоМедианная длина фильтра, используемая для сглаживания оценок основного тона во времени, указанная как разделенная запятыми пара, состоящая из 'MedianFilterLength"и положительное целое число. Значение по умолчанию, 1, соответствует отсутствию медианной фильтрации. Медианная фильтрация - это метод постобработки, используемый для удаления отклонений при оценке шага. Функция использует movmedian после оценки шага с использованием указанного Method.
Типы данных: single | double
f0 - Расчетная основная частота (Гц)Оцененная фундаментальная частота в Гц возвращается в виде скаляра, вектора или матрицы. Количество возвращаемых строк зависит от значений WindowLength и OverlapLength пары «имя-значение» и на размер входного сигнала. Количество возвращаемых столбцов (каналов) зависит от количества столбцов размера входного сигнала.
Типы данных: single | double
loc - Места, связанные с основными оценками частотыМестоположения, связанные с основными оценками частоты, возвращаемые в виде скаляра, вектора или матрицы того же размера, что и f0.
Фундаментальная частота оценивается локально по области WindowLength образцы. Значения loc соответствуют самой последней выборке (наибольшее число выборок), используемой для оценки фундаментальной частоты.
Типы данных: single | double
pitch функция сегментирует вход звука в соответствии с WindowLength и OverlapLength аргументы. Основная частота оценивается для каждого кадра. Вывод местоположений, loc содержит самые последние выборки (наибольшие номера выборки) соответствующего кадра.

Описание алгоритмов, используемых для оценки основной частоты, см. в соответствующих ссылках:
[1] Атал, Б.С. «Автоматическое распознавание динамика по контурам основного тона». Журнал Акустического общества Америки. Т. 52, № 6B, 1972, с. 1687-1697.
[2] Гонсалес, Сира и Майк Брукс. 19-я Европейская конференция по обработке сигналов. Барселона, 2011, стр. 451-455.
[3] Нолл, Майкл А. «Определение шага цепструма». Журнал Акустического общества Америки. т. 31, № 2, 1967, с. 293-309.
[4] Гермес, Дик Дж. «Измерение шага субгармоническим суммированием». Журнал Акустического общества Америки. т. 83, № 1, 1988, с. 257-264.
[5] Drugman, Томас и Абир Алван. «Совместное надежное обнаружение озвучивания и оценка основного тона на основе остаточных гармоник». Материалы ежегодной конференции Международной ассоциации речевой коммуникации, ИНТЕРСПИЧ. 2011, стр 1973–1976.
audioFeatureExtractor | detectSpeech | harmonicRatio | mfcc | shiftPitch
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.