подача

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

Синтаксис

f0 = pitch(audioIn,fs)
f0 = pitch(audioIn,fs,Name,Value)
[f0,loc] = pitch(___)

Описание

пример

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

пример

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

пример

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

Примеры

свернуть все

Читайте в звуковом файле и затем вызовите функцию pitch с параметрами по умолчанию.

[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');
[f0,idx] = pitch(audioIn,fs);

Постройте контур подачи и звуковой сигнал.

subplot(2,1,1)
plot(audioIn)
ylabel('Amplitude')

subplot(2,1,2)
plot(idx,f0)
ylabel('Pitch (Hz)')
xlabel('Sample Number')

Функция pitch оценивает основную частоту входного сигнала в местоположениях, определенных парами "имя-значение" OverlapLength и WindowLength.

Загрузите звуковой файл введения в Фюр Элис и частоту дискретизации аудио. Вызовите функцию pitch использование оценочного фильтра подачи (PEF), поисковый диапазон от 50 Гц до 800 Гц, длина окна 80 мс и перекрытие 50 мс. Постройте результаты и слушайте песню, чтобы проверить основные оценки частоты, возвращенные функцией pitch.

load FurElise.mat song fs

[f0,loc] = pitch(song,fs, ...
    'Method','PEF', ...
    'Range',[50 800], ...
    'WindowLength',round(fs*0.08), ...
    'OverlapLength',round(fs*0.05));

t = loc/fs;
plot(t,f0)
ylabel('Pitch (Hz)')
xlabel('Time (s)')

sound(song,fs)

Различные методы оценки подачи обеспечивают компромиссы с точки зрения шумовой робастности, точности, оптимальной задержки и расхода вычисления. В этом примере вы сравниваете производительность различных алгоритмов обнаружения подачи с точки зрения грубой ошибки подачи (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.021 (s)
- PEF : 0.064 (s)
- CEP : 0.022 (s)
- LHS : 0.035 (s)
- SRH : 0.052 (s)

Читайте в целом речевом файле и определите основную частоту аудио с помощью функции pitch. Затем используйте voiceActivityDetector, чтобы удалить несоответствующую информацию о подаче, которая не соответствует динамику.

Читайте в звуковом файле и сопоставленной частоте дискретизации.

[audio,fs] = audioread('Counting-16-44p1-mono-15secs.wav');

Задайте обнаружение подачи с помощью длины окна на 50 мс и перекрытия на 40 мс (транзитный участок на 10 мс). Укажите, что функция pitch ищет основную частоту в области значений 50-150 Гц и постобрабатывает результаты со средним фильтром. Постройте график результатов.

windowLength = round(0.05*fs);
overlapLength = round(0.04*fs);
hopLength = windowLength - overlapLength;

[f0,loc] = pitch(audio,fs, ...
    'WindowLength',windowLength, ...
    'OverlapLength',overlapLength, ...
    'Range',[50 150], ...
    'MedianFilterLength',3);

plot(loc/fs,f0)
ylabel('Fundamental Frequency (Hz)')
xlabel('Time (s)')

Создайте Систему dsp.AsyncBuffer object™, чтобы разделить звуковой сигнал на блоки в перекрытые кадры. Также создайте Систему voiceActivityDetector object™, чтобы определить, содержат ли кадры речь.

buffer = dsp.AsyncBuffer(numel(audio));
write(buffer,audio);
VAD = voiceActivityDetector;

В то время как существует достаточно выборок, чтобы скачкообразно двинуться, читайте из буфера и определите вероятность, что кадр содержит речь. Чтобы подражать интервалу решения во время функции pitch, первый кадр, считанный из буфера, не имеет никакого перекрытия.

n = 1;
probabilityVector = zeros(numel(loc),1);
while buffer.NumUnreadSamples >= hopLength
    if n==1
        x = read(buffer,windowLength);
    else
        x = read(buffer,windowLength,overlapLength);
    end
    probabilityVector(n) = VAD(x);
    n = n+1;
end

Используйте вектор вероятности, полный решимости voiceActivityDetector построить контур подачи для речевого файла, который соответствует областям речи.

validIdx = probabilityVector>0.99;
loc(~validIdx) = nan;
f0(~validIdx) = nan;
plot(loc/fs,f0)
ylabel('Fundamental Frequency (Hz)')
xlabel('Time (s)')

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

свернуть все

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

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

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

Частота дискретизации должна быть больше, чем или равной дважды верхней границе поисковой области значений. Задайте поисковую область значений с помощью пары "имя-значение" Range.

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

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (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, 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