exponenta event banner

spectralFlux

Спектральный поток для звуковых сигналов и слуховых спектрограмм

Описание

пример

flux = spectralFlux(x,f) возвращает спектральный поток сигнала, x, со временем. Спектральный поток является мерой изменчивости спектра во времени. Как интерпретируется функция x зависит от формы f.

пример

flux = spectralFlux(x,f,initialCondition) задает предыдущее спектральное состояние. Этот синтаксис поддерживается только для входов в частотной области.

пример

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

Например, flux = spectralFlux(x,f,'NormType',1) вычисляет спектральный поток, используя норму типа 1.

пример

[flux,finalCondition] = spectralFlux(___) также возвращает конечное спектральное состояние.

Примеры

свернуть все

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

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

t = linspace(0,size(audioIn,1)/fs,size(flux,1));
plot(t,flux)
xlabel('Time (s)')
ylabel('Flux')

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

Прочитайте аудиофайл, а затем рассчитайте спектрограмму mel с помощью melSpectrogram функция. Вычислите поток спектрограммы mel с течением времени. Постройте график результатов.

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

[s,cf,t] = melSpectrogram(audioIn,fs);

flux = spectralFlux(s,cf);

plot(t,flux)
xlabel('Time (s)')
ylabel('Flux')

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

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

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

Вычислите поток спектра мощности во времени. Рассчитайте поток для окон Хэмминга 50 мс данных с перекрытием 25 мс. Используйте диапазон от 62,5 Гц до fs/ 2 для расчета потока. Постройте график результатов.

flux = spectralFlux(audioIn,fs, ...
                    'Window',hamming(round(0.05*fs)), ...
                    'OverlapLength',round(0.025*fs), ...
                    'Range',[62.5,fs/2]);
                        
t = linspace(0,size(audioIn,1)/fs,size(flux,1));
plot(t,flux)
xlabel('Time (s)')
ylabel('Flux')

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

Спектральный поток измеряет изменение последовательных спектров. Для вычисления спектрального потока потокового звука можно передать состояние в функцию и из нее.

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

fileReader = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav');
inputBuffer = dsp.AsyncBuffer;
logger = dsp.AsyncBuffer;

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

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

  2. Запишите аудиоданные во входной буфер.

  3. Если из буфера доступен скачок данных, считывайте кадр данных с перекрытием.

  4. Вычислите одностороннее короткое преобразование Фурье.

  5. Вычислите спектральный поток.

  6. Запишите спектральный поток для последующего построения графика.

fs = fileReader.SampleRate;

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

samplesPerHop = samplesPerFrame - samplesOverlap;

win = hamming(samplesPerFrame,'periodic');

Sprev = [];
while ~isDone(fileReader)
    audioIn = fileReader();
    write(inputBuffer,audioIn);
    
    while inputBuffer.NumUnreadSamples >= samplesPerHop
        audioBuffered = read(inputBuffer,samplesPerFrame,samplesOverlap);
        [S,f] = stft(audioBuffered,fs,"Window",win,"OverlapLength",samplesOverlap,"FrequencyRange","onesided");
        [flux,Sprev] = spectralFlux(abs(S),f,Sprev);
        write(logger,flux);
    end
    
end
release(fileReader)

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

plot(read(logger))
ylabel('Flux')

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

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

свернуть все

Входной сигнал, заданный как вектор, матрица или 3-D массив. Как интерпретируется функция x зависит от формы f.

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

Частота дискретизации или частотный вектор в Гц, заданный как скаляр или вектор соответственно. Как интерпретируется функция x зависит от формы f:

  • Если f является скаляром, x интерпретируется как сигнал временной области, и f интерпретируется как частота выборки. В этом случае x должен быть действительным вектором или матрицей. Если x задается как матрица, столбцы интерпретируются как отдельные каналы.

  • Если f является вектором, x интерпретируется как сигнал частотной области, и f интерпретируется как частоты, в Гц, соответствующие строкам x. В этом случае x должен быть действительным массивом L-за-M-за-N, где L - число спектральных значений на заданных частотах fM - количество отдельных спектров, а N - число каналов.

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

Предыдущее спектральное состояние, указанное как матрица L-на-N, где:

  • L - количество ячеек в одностороннем спектральном представлении, равном numel(f).

  • N - количество каналов аудиоданных, равное size(x,3).

Если initialCondition не указан или указан как пустой, spectralFlux рассматривает первый спектр как повторяющийся. То есть первый flux выходной сигнал равен нулю.

Зависимости

Этот входной аргумент допустим только в том случае, если x, является представлением аудио в частотной области. spectralFlux функция интерпретирует область входа x на основе размера f.

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

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

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

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

Тип нормы, используемый для расчета потока, указанный как разделенная запятыми пара, состоящая из 'NormType' и 2 или 1.

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

Примечание

Следующие аргументы пары имя-значение применяются, если x является сигналом временной области. Если x является сигналом частотной области, следующие аргументы пары имя-значение игнорируются.

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

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

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

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

Количество ячеек, используемых для вычисления DFT входных выборок с окнами, указанных как разделенная запятыми пара, состоящая из 'FFTLength' и положительное скалярное целое число. Если не указано, FFTLength по умолчанию - количество элементов в Window.

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

Диапазон частот в Гц, указанный как разделенная запятыми пара, состоящая из 'Range' и двухэлементный вектор строк, увеличивающий действительные значения в диапазоне [0, f/2].

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

Тип спектра, указанный как разделенная запятыми пара, состоящая из 'SpectrumType' и 'power' или 'magnitude':

  • 'power' - Спектральный поток вычисляется для одностороннего спектра мощности.

  • 'magnitude' - Спектральный поток вычисляется для одностороннего спектра амплитуды.

Типы данных: char | string

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

свернуть все

Спектральный поток в Гц, возвращаемый как скаляр, вектор или матрица. Каждая строка flux соответствует спектральному потоку окна x. Каждый столбец flux соответствует независимому каналу.

Конечное спектральное состояние, возвращаемое в виде матрицы L-на-N, где:

  • L - количество ячеек в одностороннем спектральном представлении, равном numel(f).

  • N - количество каналов аудиоданных, равное size(x,3).

Зависимости

Этот выходной аргумент допустим, только если вход, x, является представлением аудио в частотной области. spectralFlux функция интерпретирует область входа x на основе размера f.

Алгоритмы

Спектральный поток вычисляют, как описано в [1]:

поток (t) = (∑k=b1b2|sk (t) sk (t − 1) | P) 1P

где

  • sk - спектральное значение в ячейке k.

  • b1 и b2 - границы полосы в ячейках, по которым вычисляется спектральный поток.

  • P - тип нормы. Тип нормы можно указать с помощью NormType.

Ссылки

[1] Scheirer, E. и М. Слэни. «Построение и оценка надежного многофункционального дискриминатора речи/музыки». Международная конференция IEEE по акустике, речи и обработке сигналов. Том 2, 1997, стр. 1221-1224.

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

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

.

Массивы графических процессоров
Ускорьте выполнение кода с помощью графического процессора (GPU) с помощью Parallel Computing Toolbox™.

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