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.

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

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

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, размер (Window,1)).

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

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

свернуть все

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

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

Алгоритмы

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

Γ(m)=n=1Ns(n)s(nm)n=1Ns(n)2n=0Ns(nm)2для(1mM)

где

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

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

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

βHR=maxM0mM{Γ(m)}

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

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

Ссылки

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

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

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

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

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