exponenta event banner

подача

Оценка основной частоты звукового сигнала

Описание

пример

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

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.

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

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

Создание тестовых сигналов путем добавления шума к звуковому сигналу в заданных 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)

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

свернуть все

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

Типы данных: 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 < Range(1)Range(2) < fs/2
'PEF'10 < Range(1)Range(2) < min(4000,fs/2)
'CEP'fs/(2^nextpow2(2*WindowLength-1)) < Range(1)Range(2) < fs/2
'LHS'1 < Range(1)Range(2) < fs/5 - 1
'SRH'1 < Range(1)Range(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' -- Определение шага кепстра [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] Атал, Б.С. «Автоматическое распознавание динамика по контурам основного тона». Журнал Акустического общества Америки. Т. 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.

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2018a