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);

Слушайте звуковой сигнал и постройте сигнал и подачу. 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.014 (s)
- PEF : 0.048 (s)
- CEP : 0.015 (s)
- LHS : 0.024 (s)
- SRH : 0.046 (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, min (размер (audioIn, 1), 192000)]. Типичные аналитические окна находятся в области значений 20-100 мс. Длина окна по умолчанию составляет 52 мс.

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

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

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

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

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

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

  • 'CEP' – Определение подачи кепстра [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' – Определение подачи кепстра [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.

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

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

Введенный в R2018a