harmonicRatio

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

Синтаксис

hr = harmonicRatio(audioIn,fs)
hr = harmonicRatio(audioIn,fs,Name,Value)

Описание

пример

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

Читайте в звуковом файле.

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

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

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

Создайте объект 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')

Если вход к вашему циклу аудиопотока имеет переменные выборки на кадр, противоречивые выборки на кадр с аналитическим размером окна 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')

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

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

Создайте чистый тон и затем вычислите гармоническое отношение с помощью параметров по умолчанию. По умолчанию гармоническое отношение вычисляется для Окон Хэмминга на 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')

Кратковременный анализ, требуемый для работы с окнами, понижает гармоническое отношение от теоретического значения 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')

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

Создайте 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')

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

свернуть все

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

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

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

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

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

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

где

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

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

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

βHR=max M0mM{Γ(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