acousticFluctuation

Воспринятая сила колебания акустического сигнала

Описание

пример

fluctuation = acousticFluctuation(audioIn,fs) возвращает силу колебания в vacil по данным Zwicker и др. и ISO 532-1 изменяющаяся во времени громкость. [1][2]

пример

fluctuation = acousticFluctuation(audioIn,fs,calibrationFactor) указывает, что калибровочный фактор микрофона не по умолчанию использовался для расчета громкости.

пример

fluctuation = acousticFluctuation(specificLoudnessIn) вычисляет колебание с помощью определенной громкости.

пример

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

Пример: fluctuation = acousticFluctuation(audioIn,fs,'SoundField','diffuse') возвращает колебание, принимающее рассеянное звуковое поле.

[fluctuation,specificFluctuation] = acousticFluctuation(___) также возвращает определенную силу колебания.

[fluctuation,specificFluctuation,fMod] = acousticFluctuation(___) также возвращает доминирующую частоту модуляции.

пример

acousticFluctuation(___) без выходных аргументов строит силу колебания и определенную силу колебания и отображает частоту модуляции дословно. Если вход является стерео, 3-D график показывает сумму обоих каналов.

Примеры

свернуть все

Измерьте акустическое колебание по данным Zwicker и др. [2] и ISO 532-1 [1]. Примите, что уровень записи калибруется таким образом, что тон на 1 кГц указывает как 100 дБ на метре SPL.

[audioIn,fs] = audioread('WashingMachine-16-44p1-stereo-10secs.wav');

fluctuation = acousticFluctuation(audioIn,fs);

Настройте эксперимент, как обозначено схемой.

Создайте audioDeviceReader возразите, чтобы читать из микрофона и audioDeviceWriter возразите, чтобы записать в ваш динамик.

fs = 48e3;
deviceReader = audioDeviceReader(fs,"SamplesPerFrame",0.5*fs);
deviceWriter = audioDeviceWriter(fs);

Создайте audioOscillator объект сгенерировать синусоиду на 1 кГц.

osc = audioOscillator("sine",1e3,"SampleRate",fs,"SamplesPerFrame",0.5*fs);

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

dur = 5;
buff = dsp.AsyncBuffer(dur*fs);

В течение пяти секунд проигрывайте синусоиду через свой динамик и запись с помощью микрофона. В то время как аудиопотоки, отметьте громкость, как сообщается вашим метром SPL. Однажды завершенный, считайте содержимое буферного объекта.

numFrames = dur*(fs/osc.SamplesPerFrame);
for ii = 1:numFrames
    audioOut = osc();
    deviceWriter(audioOut);
    
    audioIn = deviceReader();
    write(buff,audioIn);
end

SPLreading = 60.4;

micRecording = read(buff);

Чтобы вычислить калибровочный фактор для микрофона, используйте calibrateMicrophone функция.

calibrationFactor = calibrateMicrophone(micRecording,deviceReader.SampleRate,SPLreading);

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

Выполните эксперимент снова, на этот раз, добавьте 100%-ю амплитудную модуляцию на уровне 4 Гц. Чтобы создать сигнал модуляции, используйте audioOscillator и задайте амплитуду как 0.5 и смещение DC как 0.5 колебаться между 0 и 1.

mod = audioOscillator("sine",4,"SampleRate",fs, ...
    "Amplitude",0.5,"DCOffset",0.5,"SamplesPerFrame",0.5*fs);

dur = 10;
buff = dsp.AsyncBuffer(dur*fs);
numFrames = dur*(fs/osc.SamplesPerFrame);
for ii = 1:numFrames
    audioOut = osc().*mod();
    deviceWriter(audioOut);
    
    audioIn = deviceReader();
    write(buff,audioIn);
end

micRecording = read(buff);

Вызовите acousticFluctuation с записью микрофона, частотой дискретизации и калибровочным фактором. О колебании сообщают от acousticFluctuation использует истинное акустическое измерение громкости, как задано 532-1. Отобразите среднюю силу колебания за эти 10 секунд.

fluctuation = acousticFluctuation(micRecording,deviceReader.SampleRate,calibrationFactor);
fprintf('Average fluctuation = %d (vacil)',mean(fluctuation))
Average fluctuation = 4.172749e-01 (vacil)

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

[audioIn,fs] = audioread("Engine-16-44p1-stereo-20sec.wav");

Вызовите acousticLoudness вычислить определенную громкость.

[~,specificLoudness] = acousticLoudness(audioIn,fs,"TimeVarying",true);

Вызовите acousticSharpness без любых выходных параметров, чтобы построить акустическую резкость.

acousticSharpness(specificLoudness,'TimeVarying',true)

Вызовите acousticFluctuation без любых выходных параметров, чтобы построить акустическое колебание.

acousticFluctuation(specificLoudness)

Сгенерируйте чистый тон с центральной частотой на 1 500 Гц и отклонением частоты на приблизительно 700 Гц на частоте модуляции 0,25 Гц.

fs = 48e3;

fMod = 0.25;
dur = 20;

numSamples = dur*fs;
t = (0:numSamples-1) / фс;

настройте = sin (2*pi*t*fMod)';

ФК = 1500;
excursionRatio = 0.47;

отклонение = 2*pi* (fc*excursionRatio/fs);
audioIn = модулируют (тон, ФК, фс,'fm', отклонение);

Слушайте первые 5 секунд аудио и постройте спектрограмму.

sound(audioIn(1:5*fs),fs)
spectrogram(audioIn(1:5*fs),hann(512,'periodic'),256,1024,fs,'yaxis')

Вызовите acousticFluctuation без выходных аргументов, чтобы построить акустическую силу колебания.

acousticFluctuation(audioIn,fs);

acousticFluctuation функция позволяет вам задать известную частоту колебания. Если вы не задаете известную частоту колебания, функция автоматически обнаруживает колебание.

Создайте dsp.AudioFileReader возразите, чтобы читать в покадровом звуковом сигнале. Создайте audioOscillator объект создать волну модуляции. Примените волну модуляции к звуковому файлу.

fileReader = dsp.AudioFileReader('Engine-16-44p1-stereo-20sec.wav');

fmod = 10.8;
амплитуда = 0.15;

osc = audioOscillator ('sine', fmod, ...
    "DCOffset",0.5, ...
    "Amplitude", амплитуда, ...
    "SampleRate", fileReader.SampleRate, ...
    "SamplesPerFrame", fileReader.SamplesPerFrame);

testSignal = [];
while ~isDone (средство чтения файлов)
    x = средство чтения файлов ();
    testSignal = [testSignal; osc ().*fileReader ()];
end

Слушайте две секунды тестового сигнала и постройте его форму волны.

samplesToView = 1:2*fileReader.SampleRate;
sound(testSignal(samplesToView,:),fileReader.SampleRate);

plot(samplesToView/fileReader.SampleRate,testSignal(samplesToView,:))
xlabel('Time (s)')

Постройте акустическое колебание. Обнаруженная частота модуляции отображена дословно.

acousticFluctuation(testSignal,fileReader.SampleRate);

Задайте известную частоту модуляции и затем постройте акустическое колебание снова.

acousticFluctuation(testSignal,fileReader.SampleRate,'ModulationFrequency',fmod)

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

свернуть все

Аудиовход в виде (моно) вектор-столбца или матрица с двумя столбцами (стерео).

Совет

Чтобы измерить силу колебания, учитывая любую частоту модуляции, рекомендуемая минимальная длительность сигнала составляет 10 секунд.

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

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

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

Калибровочный фактор микрофона в виде положительной скалярной величины. Калибровочный фактор по умолчанию соответствует полномасштабной синусоиде на 1 кГц с уровнем звукового давления 100 дБ (SPL). Чтобы вычислить калибровочный фактор, характерный для вашей системы, используйте calibrateMicrophone функция.

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

Определенная громкость в сонах/Коре в виде T-by-240-by-C массив, где:

  • T один на 2 мс изменяющегося во времени сигнала.

  • 240 количество интервалов Коры в области для определенной громкости. Интервалами Коры является 0.1:0.1:24.

  • C является количеством каналов.

Можно использовать acousticLoudness функция, чтобы вычислить изменяющуюся во времени определенную громкость с помощью этого синтаксиса:

[~,specificLoudness] = acousticLoudness(audioIn,fs,'TimeVarying',true);

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

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

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

Пример: acousticFluctuation(audioIn,fs,'ModulationFrequency',50)

Известная частота модуляции в Гц, заданном любой 'auto-detect' или как скалярный или двухэлементный вектор со значениями в области значений [0.1,100]. Если ModulationFrequency установлен в 'auto-detect', затем функция ограничивает поисковую область значений между 0,2 и 64 Гц. Если вход моно, то частота модуляции должна быть задана как скаляр. Если вход является стерео, то частота модуляции может быть задана или как скалярный или как двухэлементный вектор.

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

Звуковое поле аудиозаписи в виде 'free' или 'diffuse'.

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

Ссылочное давление для вычисления дБ в pascals в виде положительной скалярной величины. Значением по умолчанию, 20 micropascals, является общее значение воздуха.

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

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

свернуть все

Сила колебания в vacil, возвращенном как K-by-1 вектор-столбец или K-by-2 матрица независимых каналов. K соответствует измерению времени.

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

Определенная сила колебания в vacil/Bark, возвращенном как K-by-47 матрица или K-by-47-by-2 массив. Первая размерность specificFluctation, K, соответствует измерению времени и совпадает с первой размерностью fluctuation. Второе измерение specificFluctation, 47, соответствует полосам по шкале Коры, с центрами от 0,5 до 23,5, включительно, с 0,5 шагом. Третья размерность specificFluctation соответствует количеству каналов и совпадает со вторым измерением fluctuation.

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

Доминирующая частота модуляции в Гц, возвращенном как скаляр для моно входа или вектор 1 на 2 для стереовхода.

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

Алгоритмы

Акустическая сила колебания является перцепционным измерением медленных модуляций в амплитуде или частоте. Акустический алгоритм громкости описан в [1] и реализован в acousticLoudness функция. Акустическое вычисление колебания описано в [2]. Алгоритм для акустического колебания обрисован в общих чертах можно следующим образом.

fluctuation=0.008z=024ΔLdz(fmod4)+(4fmod)

Где mod f является обнаруженной или известной частотой модуляции, и ΔL является воспринятой глубиной модуляции. Если частота модуляции не задана при вызове acousticFluctuation, это автоматически обнаруживается выбором пика представление частотного диапазона акустической громкости. Воспринятая глубина модуляции, ΔL, вычисляется путем передачи, исправил определенные полосы громкости через ½ фильтра октавы, сосредоточенные вокруг mod f, сопровождаемого фильтром lowpass, чтобы определить конверт.

Ссылки

[1] ISO, 532-1:2017 (E). "Акустика – Методы для вычисления громкости – Часть 1: метод Zwicker". Международная организация по стандартизации.

[2] Zwicker, Эберхард и Х. Фэстл. Психоакустика: Факты и Модели. 2-й обновленный редактор, Спрингер, 1999.

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

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

Введенный в R2020b
Для просмотра документации необходимо авторизоваться на сайте