pitch

Оцените основную частоту аудиосигнала

Описание

пример

f0 = pitch(audioIn,fs) возвращает оценки основной частоты во времени для звукового входа, audioIn, со скоростью дискретизации fs. Столбцы входа обрабатываются как отдельные каналы.

пример

f0 = pitch(audioIn,fs,Name,Value) задает опции с использованием одного или нескольких Name,Value аргументы в виде пар.

пример

[f0,loc] = pitch(___) возвращает местоположения, loc, сопоставленный с фундаментальными оценками частоты.

Примеры

свернуть все

Считывайте аудиосигнал. Функции 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)')

Figure contains 2 axes. Axes 1 contains an object of type line. Axes 2 contains an object of type line.

Считайте аудиосигнал и извлеките тангаж.

[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

Figure contains 2 axes. Axes 1 with title Audio Signal contains an object of type line. Axes 2 with title Pitch Estimations contains an object of type line.

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

Figure contains 3 axes. Axes 1 with title Audio Signal contains an object of type line. Axes 2 with title Pitch Estimations contains an object of type line. Axes 3 with title Harmonic Ratio contains an object of type line.

Используйте коэффициент гармоники в качестве порога для допустимых решений тангажа. Если коэффициент гармоники меньше порога, задайте значение тангажа NaN. Постройте график результатов.

threshold = 0.9;
f0(hr < threshold) = nan;

figure
plot(tf0,f0)
xlabel('Time (s)')
ylabel('Pitch (Hz)')
title('Pitch Estimations')
grid on

Figure contains an axes. The axes with title Pitch Estimations contains an object of type line.

Считывайте аудиосигнал женского голоса, произнося «громкость» пять раз. Слушайте аудио.

[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

Figure contains an axes. The axes contains 2 objects of type histogram. These objects represent Female Voice, Male Voice.

Используйте 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')

Figure contains an axes. The axes contains 2 objects of type histogram. These objects represent Female Voice, Male Voice.

Загрузите аудио файла введения 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

Figure contains an axes. The axes contains an object of type line.

Создайте 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

Figure contains an axes. The axes contains an object of type line.

Различные методы оценки тангажа обеспечивают компромиссы с точки зрения робастности, точности, оптимальной задержки и вычислительных расходов. В этом примере вы сравниваете эффективность различных алгоритмов обнаружения тангажа с точки зрения полной ошибки тангажа (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)

Входные параметры

свернуть все

Аудио входного сигнала, заданный как вектор или матрица. Столбцы матрицы рассматриваются как отдельные аудиоканалы.

Типы данных: single | double

Частота дискретизации входного сигнала в Гц, заданная как положительная скалярная величина.

Частота дискретизации должна быть больше или равной двойной верхней границы области значений поиска. Задайте область значений поиска используя 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'fs/ WindowLength < Область значений (1)Область значений (2) < fs/2
'PEF'10 < Range(1)Область значений (2) < min (4000, fs/2)
'CEP'fs/ (2^nextpow2 (2* WindowLength-1)) < Область значений (1)Область значений (2) < fs/2
'LHS'1 < Range(1)Область значений (2) < fs/5 - 1
'SRH'1 < Range(1)Область значений (2) < fs/5 - 1

Типы данных: single | double

Количество выборок в окне анализа, заданное как разделенная разделенными запятой парами, состоящая из 'WindowLength'и целое число в области значений [1, мин (размер (audioIn,1), 192000)]. Типичные окна анализа находятся в области значений 20-100 мс. Длина окна по умолчанию составляет 52 мс.

Типы данных: single | double

Количество выборок перекрытия между смежными окнами анализа, заданное как разделенная разделенными запятой парами, состоящая из 'OverlapLength'и целое число в области значений (-inf, WindowLength). Отрицательная длина перекрытия указывает на неперекрывающиеся окна анализа.

Типы данных: single | double

Метод, используемый для оценки тангажа, задается как разделенная разделенными запятой парами, состоящая из 'Method'NCF', 'PEF', 'CEP', 'LHS', или 'SRH'. Различные методы вычисления тангажа обеспечивают компромиссы с точки зрения робастности шума, точности и расчета затрат. Алгоритмы, используемые для вычисления тангажа, основаны на следующих бумагах:

  • 'NCF' -- Нормированная корреляционная функция [1]

  • 'PEF' - Фильтр оценки тангажа [2]. Функция не использует амплитудное сжатие, описанное в бумаге.

  • 'CEP' -- Определение тангажа Cepstrum [3]

  • 'LHS' - Логарифмическое суммирование [4]

  • 'SRH' - Суммирование остаточных гармоник [5]

Типы данных: char | string

Медианная длина фильтра, используемая для сглаживания оценок тангажа с течением времени, задается как разделенная разделенными запятой парами, состоящая из 'MedianFilterLength'и положительное целое число. Значение по умолчанию, 1, не соответствует никакой медианной фильтрации. Медианная фильтрация является методом постобработки, используемым для удаления выбросов при оценке тангажа. Функция использует movmedian после оценки тангажа по заданной Method.

Типы данных: single | double

Выходные аргументы

свернуть все

Предполагаемая основная частота, в Гц, возвращается в виде скаляра, вектора или матрицы. Количество возвращаемых строк зависит от значений WindowLength и OverlapLength Пары "имя-значение" и размер входного сигнала. Количество возвращаемых столбцов (каналов) зависит от количества столбцов размера входного сигнала.

Типы данных: single | double

Местоположения, сопоставленные с фундаментальными оценками частоты, возвращаются в виде скаляра, вектора или матрицы того же размера, что и f0.

Фундаментальная частота оценивается локально в области WindowLength выборки. Значения loc соответствует самой последней выборке (наибольшее число выборки), используемой для оценки основной частоты.

Типы данных: single | double

Алгоритмы

pitch функция сегментирует аудио вход в соответствии с WindowLength и OverlapLength аргументы. Основная частота оценивается для каждой системы координат. Местоположения выхода, loc содержит самые последние выборки (самые большие номера выборок) соответствующей системы координат.

Для описания алгоритмов, используемых для оценки основной частоты, обратитесь к соответствующим ссылкам:

  • 'NCF' -- Нормированная корреляционная функция [1]

  • 'PEF' - Фильтр оценки тангажа [2]. Функция не использует амплитудное сжатие, описанное в бумаге.

  • 'CEP' -- Определение тангажа Cepstrum [3]

  • 'LHS' - Логарифмическое суммирование [4]

  • 'SRH' - Суммирование остаточных гармоник [5]

Ссылки

[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.

Расширенные возможности

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2018a