exponenta event banner

harmonicRatio

Гармоническое отношение

Описание

пример

hr = harmonicRatio(audioIn,fs) возвращает гармоническое отношение сигнала, audioIn, со временем. Столбцы ввода обрабатываются как отдельные каналы.

пример

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

Пример: hr = harmonicRatio(audioIn,fs,'Window',rectwin(round(fs*0.1)),'OverlapLength',round(fs*0.05)) возвращает отношение гармоник для входного аудиосигнала, дискретизированного в fs Гц. Отношение гармоник вычисляется для прямоугольных окон 100 мс с перекрытием 50 мс.

Примеры

свернуть все

Прочтите аудиофайл, рассчитайте отношение гармоник с помощью параметров по умолчанию, а затем постройте график результатов.

[audioIn,fs] = audioread('RandomOscThree-24-96-stereo-13secs.aif');
audioInMono = mean(audioIn,2);

hr = harmonicRatio(audioInMono,fs);

t = (0:length(audioInMono)-1)/fs;
subplot(2,1,1)
plot(t,audioInMono)
ylabel('Amplitude')

t = linspace(0,size(audioInMono,1)/fs,size(hr,1));
subplot(2,1,2)
plot(t,hr)
xlabel('Time (s)')
ylabel('Harmonic Ratio')

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

Чтение в аудиофайле.

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

Вычислите коэффициент гармоник аудиофайла, используя окна Hann 50 мс с перекрытием 25 мс. Постройте график результатов.

hr = harmonicRatio(audioIn,fs, ...
                   'Window',hann(round(fs.*0.05),'periodic'), ...
                   'OverlapLength',round(fs.*0.025));

t = linspace(0,size(audioIn,1)/fs,size(hr,1));
plot(t,hr)
xlabel('Time (s)')
ylabel('Harmonic Ratio')

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

Гармоническое отношение указывает отношение энергии в гармонической части звука к общей энергии звука. Поскольку аудиосигнал в этом примере имеет области почти молчания, где общая энергия очень низкая, гармоническое отношение делает плохую работу, различая области речи и области молчания. Добавьте белый шум к звуковому сигналу, а затем рассчитайте и постройте график гармонического отношения.

audioIn = audioIn + 0.1*randn(size(audioIn));
hr = harmonicRatio(audioIn,fs, ...
                   'Window',hann(round(fs.*0.05),'periodic'), ...
                   'OverlapLength',round(fs.*0.025));

t = linspace(0,size(audioIn,1)/fs,size(hr,1));
plot(t,hr)
xlabel('Time (s)')
ylabel('Harmonic Ratio')

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

Создать dsp.AudioFileReader объект для считывания в стереоданных аудиоданных покадрово. Создать dsp.SignalSink объект для регистрации вычисления гармонического отношения.

fileReader = dsp.AudioFileReader('RandomOscThree-24-96-stereo-13secs.aif');
logger = dsp.SignalSink;

В цикле аудиопотока:

  1. Считывание в кадре аудиоданных.

  2. Вычислите отношение гармоник для каждого канала кадра звука.

  3. Запишите отношение гармоник для последующего построения графика.

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

win = hamming(fileReader.SamplesPerFrame,'periodic');
while ~isDone(fileReader)
    audioIn = fileReader();
    
    hr = harmonicRatio(audioIn,fileReader.SampleRate, ...
                       'Window',win, ...
                       'OverlapLength',0);
    logger(hr)
end

plot(logger.Buffer)
ylabel('Harmonic Ratio')
legend('Left Channel','Right Channel')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Left Channel, Right Channel.

Если вход в цикл аудиопотока имеет переменную выборку на кадр, несогласованная выборка на кадр с размером окна анализа, равным harmonicRatioили если вы хотите вычислить отношение гармоник перекрывающихся данных, используйте dsp.AsyncBuffer.

Создать dsp.AsyncBuffer , сбросьте средство регистрации и отпустите средство чтения файлов.

buff = dsp.AsyncBuffer;
reset(logger)
release(fileReader)

Вычислите гармоническое отношение, используя кадры 50 мс с перекрытием 25 мс.

fs = fileReader.SampleRate;

samplesPerFrame = round(fs*0.05);
samplesOverlap = round(fs*0.025);

samplesPerHop = samplesPerFrame - samplesOverlap;

win = hamming(samplesPerFrame);

while ~isDone(fileReader)
    audioIn = fileReader();
    write(buff,audioIn);

    while buff.NumUnreadSamples >= samplesPerHop
        audioBuffered = read(buff,samplesPerFrame,samplesOverlap);

        hr = harmonicRatio(audioBuffered,fs, ...
                           'Window',win, ...
                           'OverlapLength',0);
        logger(hr)
    end

end
release(fileReader)

Постройте график зарегистрированных данных.

plot(logger.Buffer)
ylabel('Harmonic Ratio')
legend('Left Channel','Right Channel')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Left Channel, Right Channel.

Гармоническое отношение измеряет количество энергии в тональной части сигнала по сравнению с количеством энергии в общем сигнале.

Гармоническое отношение чистого тона

Создайте чистый тон, а затем рассчитайте отношение гармоник с помощью параметров по умолчанию. По умолчанию отношение гармоник вычисляется для окон Хэмминга 30 мс с 10 мс прыжками. Постройте график результатов. Гармоническое отношение около 1, что является теоретическим максимумом.

fs = 48e3;
osc = audioOscillator('Frequency',500, ...
    'SamplesPerFrame',192e3,'SampleRate',fs);
sinewave = osc();

hr = harmonicRatio(sinewave,fs);

t = linspace(0,size(sinewave,1)/fs,size(hr,1));
plot(t,hr)
xlabel('Time (s)')
ylabel('Harmonic Ratio')
title('Sinusoid - Default Parameters')

Figure contains an axes. The axes with title Sinusoid - Default Parameters contains an object of type line.

Кратковременный анализ, необходимый для оконной обработки, снижает отношение гармоник от теоретического значения 1. Чтобы уменьшить эффект оконной обработки, можно увеличить размер окна. Используйте окно Хэмминга 100 мс и транзитный участок 10 мс и убедитесь, что гармоническое отношение ближе к единице, чем при использовании длины окна по умолчанию.

win = hamming(round(fs*0.1),'periodic');
overlap = round(fs*0.099);

hr = harmonicRatio(sinewave,fs,'Window',win,'OverlapLength',overlap);

t = linspace(0,size(sinewave,1)/fs,size(hr,1));
plot(t,hr)
xlabel('Time (s)')
ylabel('Harmonic Ratio')
title('Sinusoid - 100 ms Window')

Figure contains an axes. The axes with title Sinusoid - 100 ms Window contains an object of type line.

Гармоническое отношение белого шума

Создайте 5 секунд белого шума, а затем рассчитайте отношение гармоник с помощью параметров по умолчанию. По умолчанию отношение гармоник вычисляется для окон Хэмминга 30 мс с 10 мс прыжками. Постройте график результатов. Гармоническое отношение равно 0.

fs = 48e3;
noise = rand(fs*5,1);

hr = harmonicRatio(noise,fs);

t = linspace(0,size(noise,1)/fs,size(hr,1));
plot(t,hr)
xlabel('Time (s)')
ylabel('Harmonic Ratio')
title('Noise - Default Parameters')

Figure contains an axes. The axes with title Noise - Default Parameters contains an object of type line.

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

свернуть все

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

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

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

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

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

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'Window',hamming(256)

«Окно, примененное во временной области, указанное как разделенная запятыми пара, состоящая из»Windowи реальный вектор. Число элементов в векторе должно находиться в диапазоне [1, size(audioIn,1)]. Число элементов в векторе также должно быть больше OverlapLength.

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

Число выборок, перекрывающихся между соседними окнами, указанное как разделенная запятыми пара, состоящая из 'OverlapLength'и целое число в диапазоне [0, size(Window,1)).

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

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

свернуть все

Гармоническое отношение, возвращаемое как скаляр, вектор или матрица. Каждая строка hr соответствует гармоническому отношению окна audioIn. Гармоническое отношение возвращается со значениями в диапазоне [0,1]. Значение 0 представляет низкую гармоничность, а значение 1 представляет высокую гармоничность.

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

Алгоритмы

Гармоническое отношение вычисляется, как описано в [1]. Следующий алгоритм применяется независимо к каждому окну аудиоданных. Нормализованная автокорреляция сигнала определяется как:

Γ (m) =∑n=1Ns (n) s (n m) ∑n=1Ns (n) 2∑n=0Ns (n m) 2 для (1≤m≤M)

где

  • s - это один кадр аудиоданных с N элементами.

  • М - максимальное отставание в расчете. Максимальное отставание составляет 40 мс, что соответствует минимальной основной частоте 25 Гц.

Первая оценка гармонического отношения определяется как максимум нормированной автокорреляции в заданном диапазоне:

βHR=maxM0≤m≤M{Γ (м)}

где M0 - нижний край диапазона поиска, определяемый как первое пересечение нуля нормализованной автокорреляции.

Наконец, оценка гармонического отношения улучшается с помощью параболической интерполяции, как описано в [2].

Ссылки

[1] Ким, Хён-Гук, Николас Моро и Томас Сикора. MPEG-7 Audio and Beyond: Индексация и извлечение аудиоконтента. John Wiley & Sons, 2005.

[2] Квадратичная интерполяция спектральных пиков. Доступ состоялся 11 октября 2018 года. https://ccrma.stanford.edu/~jos/sasp/Quadratic_Interpolation_Spectral_Peaks.html

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

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

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