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 objects. Axes object 1 contains an object of type line. Axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object with title Noise - Default Parameters contains an object of type line.

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

свернуть все

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

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

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

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

Аргументы name-value

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

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

Окно, примененное во временном интервале в виде разделенной запятой пары, состоящей из 'Window'и вектор действительных чисел. Число элементов в векторе должно быть в области значений [1, размер (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] Ким, Hyoung-липкая-грязь, Николас Моро и Томас Сикора. Аудио 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++ с помощью MATLAB® Coder™.

Смотрите также

| |

Введенный в R2019a