Оцените основную частоту звукового сигнала
задает опции с помощью одного или нескольких 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')
Загрузите звуковой файл введения Фюр Элис и частоту дискретизации аудио.
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 = вокруг (winDur*fs); overlapLength = вокруг (overlapDur*fs); [f0, местоположение] = тангаж (песня, фс, ... 'Method', метод, ... 'Range'Область значений, ... 'WindowLength', winLength, ... 'OverlapLength', overlapLength, ... "MedianFilterLength", medFiltLength); t = местоположение/фс; график (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
Создайте тестовые сигналы путем добавления шума в звуковой сигнал в данном SNRs. 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.017 (s) - PEF : 0.059 (s) - CEP : 0.019 (s) - LHS : 0.021 (s) - SRH : 0.050 (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' и двухэлементного вектора-строки с увеличением положительных целочисленных значений. Функция ищет наилучшую оценку основной частоты в ребрах верхней и нижней полосы, заданных вектором, согласно алгоритму, заданному Method
. Область значений является включенной, и модули находятся в Гц.
Допустимые значения для поисковой области значений зависят от частоты дискретизации, fs
, и на значениях WindowLength
и Method
:
Метод | Минимальная область значений | Максимальная область значений |
---|---|---|
'NCF ' |
| Область значений (2) < |
'PEF ' | 10 < Range(1) | Область значений (2) <min (4000, |
'CEP ' |
| Область значений (2) < |
'LHS ' | 1 < Range(1) | Область значений (2) < |
'SRH ' | 1 < Range(1) | Область значений (2) < |
Типы данных: single
| double
WindowLength
— Количество отсчетов в аналитическом окневокруг (fs
*0.052)
(значение по умолчанию) | целое числоКоличество отсчетов в аналитическом окне в виде разделенной запятой пары, состоящей из 'WindowLength
'и целое число в области значений [1, min (размер (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'
. Различные методы вычисления тангажа обеспечивают компромиссы в терминах шумовой робастности, точности и расхода расчета. Алгоритмы, используемые, чтобы вычислить тангаж, основаны на следующих бумагах:
'NCF'
– Нормированная функция корреляции [1]
'PEF'
– Передайте Фильтр Оценки [2]. Функция не использует амплитудное сжатие, описанное бумагой.
'CEP'
– Определение тангажа кепстра [3]
'LHS'
– Гармоническое журналом суммирование [4]
'SRH'
– Суммирование остаточных гармоник [5]
Типы данных: char |
string
MedianFilterLength
— Средняя длина фильтра раньше сглаживала оценки тангажа в зависимости от времени
(значение по умолчанию) | положительное целое числоСредняя длина фильтра раньше сглаживала оценки тангажа в зависимости от времени в виде разделенной запятой пары, состоящей из 'MedianFilterLength
'и положительное целое число. Значение по умолчанию, 1
, не соответствует никакой медианной фильтрации. Медианная фильтрация является методом постобработки, используемым, чтобы удалить выбросы при оценке тангажа. Функциональное использование movmedian
после оценки тангажа с помощью заданного Method
.
Типы данных: single
| double
f0
— Предполагаемая основная частота (Гц)Предполагаемая основная частота, в Гц, возвратилась как скаляр, вектор или матрица. Количество возвращенных строк зависит от значений WindowLength
и OverlapLength
пары "имя-значение", и на размере входного сигнала. Количество столбцов возвращенные (каналы) зависит от количества столбцов размера входного сигнала.
Типы данных: single
| double
loc
— Местоположения сопоставлены с основными оценками частотыМестоположения сопоставлены с основными оценками частоты, возвращенными как скаляр, вектор или матрица тот же размер как f0
.
Основная частота оценивается локально по области WindowLength
выборки. Значения loc
соответствуйте новой выборке (самый большой демонстрационный номер) раньше оценивал основную частоту.
Типы данных: single
| double
pitch
функциональные сегменты аудиовход согласно WindowLength
и OverlapLength
аргументы. Основная частота оценивается для каждой системы координат. Местоположения выход, loc
содержит новые выборки (самые большие демонстрационные числа) соответствующей системы координат.
Для описания алгоритмов, используемых, чтобы оценить основную частоту, консультируйтесь с соответствующими ссылками:
'NCF'
– Нормированная функция корреляции [1]
'PEF'
– Передайте Фильтр Оценки [2]. Функция не использует амплитудное сжатие, описанное бумагой.
'CEP'
– Определение тангажа кепстра [3]
'LHS'
– Гармоническое журналом суммирование [4]
'SRH'
– Суммирование остаточных гармоник [5]
[1] Атал, B.S. "Автоматическое Распознавание Динамика На основе Контуров Тангажа". Журнал Акустического Общества Америки. Издание 52, № 6B, 1972, стр 1687–1697.
[2] Гонсалес, Сира и Майк Брукес. "Фильтр Оценки Тангажа, устойчивый к высокому уровню шума (PEFAC)". 19-я европейская Конференция по Обработке сигналов. Барселона, 2011, стр 451–455.
[3] Нолл, Майкл А. "Определение Тангажа кепстра". Журнал Акустического Общества Америки. Издание 31, № 2, 1967, стр 293–309.
[4] Гермес, Дик Дж. "Измерение Тангажа Субгармоническим Суммированием". Журнал Акустического Общества Америки. Издание 83, № 1, 1988, стр 257–264.
[5] Другмен, Томас и Абир Алван. "Соедините Устойчивую Оценку Обнаружения и Тангажа Озвучивания На основе Остаточных Гармоник". Продолжения Ежегодной конференции Международной Речевой Коммуникационной Ассоциации, INTERSPEECH. 2011, стр 1973–1976.
audioFeatureExtractor
| mfcc
| detectSpeech
| harmonicRatio
| shiftPitch
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.