Оцените основную частоту аудиосигнала
задает опции с использованием одного или нескольких f0
= pitch(audioIn
,fs
,Name,Value
)Name,Value
аргументы в виде пар.
Считывайте аудиосигнал. Функции pitch
для оценки основной частоты с течением времени.
[audioIn,fs] = audioread('Hey.ogg');
f0 = pitch(audioIn,fs);
Прослушайте аудиосигнал и постройте график сигнала и тангажа. The 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
The 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"; область значений = [50, 800]; % hertz winDur = 0.08; % seconds overlapDur = 0.07; % seconds medFiltLength = 10; % frames winLength = round (winDur * fs); olovapLength = round (olovapDur * fs); [f0, loc] = тангаж (песня, fs,... 'Method', метод ,... 'Range', область значений ,... 'WindowLength', winLength ,... 'OverlapLength', overlapLength ,... "MedianFilterLength", medFiltLength); t = loc/fs; график (t, f0) ylabel ('Pitch (Hz)') xlabel ('Time (s)') сетка 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
Создайте тестовые сигналы путем добавления шума к аудиосигналу при заданных ОСШ. The mixSNR
функция является функцией удобства, локальной к этому примеру, которая принимает сигнал, шум и запрашивает ОСШ и возвращает сигнал с шумом по запросу ОСШ.
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) является популярной метрикой при сравнении алгоритмов обнаружения тангажа. 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')
'Область значений'
- область значений поиска для оценок тангажа[50,400]
(по умолчанию) | двухэлементный вектор-строка с увеличением положительных целочисленных значенийОбласть значений поиска для оценок тангажа, заданный как разделенная разделенными запятой парами, состоящая из 'Range' и двухэлементного вектора-строки с увеличением положительных целочисленных значений. Функция ищет лучшую оценку основной частоты в пределах верхних и нижних ребер полосы значений, заданных вектором, согласно алгоритму, заданному Method
. Область значений включительно и модули указаны в Гц.
Допустимые значения для области значений поиска зависят от частоты дискретизации, fs
, и о значениях WindowLength
и Method
:
Метод | Минимальная область значений | Максимальная область значений |
---|---|---|
'NCF ' |
| Область значений (2) < |
'PEF ' | 10 < Range(1) | Область значений (2) < min ( |
'CEP ' |
| Область значений (2) < |
'LHS ' | 1 < Range(1) | Область значений (2) < |
'SRH ' | 1 < Range(1) | Область значений (2) < |
Типы данных: single
| double
'WindowLength'
- Количество выборок в окне анализараунд (fs
*0.052)
(по умолчанию) | целое числоКоличество выборок в окне анализа, заданное как разделенная разделенными запятой парами, состоящая из 'WindowLength
'и целое число в области значений [1, мин (размер (audioIn
,1), 192000)]. Типичные окна анализа находятся в области значений 20-100 мс. Длина окна по умолчанию составляет 52 мс.
Типы данных: single
| double
'OverlapLength'
- Количество выборок перекрытия между смежными окнами анализараунд (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] Гонсалес, Сира и Майк Брукс. «Фильтр для оценки Тангажа, устойчивый к высоким уровням шума (PEFAC)». 19-я Европейская конференция по обработке сигналов. Барселона, 2011, с. 451-455.
[3] Noll, Michael A. «Cepstrum Pitch Determination». Журнал Акустического общества Америки. Том 31, № 2, 1967, с. 293-309.
[4] Hermes, Dik J. «Measurement of Pitch by Subharmonic Summation». Журнал Акустического общества Америки. Том 83, № 1, 1988, стр. 257-264.
[5] Драгман, Томас и Абир Алван. Joint Robust Voicing Detection and Pitch Estimation Based On Leastual Harmonics (неопр.) (недоступная ссылка). Материалы ежегодной конференции Международной ассоциации речевых коммуникаций INTERSPEECH. 2011, стр 1973–1976.
audioFeatureExtractor
| detectSpeech
| harmonicRatio
| mfcc
| shiftPitch
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.