exponenta event banner

acousticFluctuation

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

Описание

пример

fluctuation = acousticFluctuation(audioIn,fs) возвращает силу флуктуации в вакууме на основе Zwicker et al. [1] и ISO 532-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 et al [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",2048);
deviceWriter = audioDeviceWriter(fs);

Создание audioOscillator создание синусоиды 1 кГц.

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

Создать 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(fs+1:end,:),deviceReader.SampleRate,SPLreading);

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

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

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

dur = 5;
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. Отображение средней интенсивности флуктуации за 5 секунд.

fluctuation = acousticFluctuation(micRecording,deviceReader.SampleRate,calibrationFactor);
fprintf('Average fluctuation = %d (vacil)',mean(fluctuation(501:end,:)))
Average fluctuation = 1.413824e+00 (vacil)
acousticFluctuation(micRecording,deviceReader.SampleRate,calibrationFactor)

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

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

Звонить acousticLoudness для вычисления конкретной громкости.

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

Звонить acousticSharpness без каких-либо выходных данных для построения графика акустической резкости.

acousticSharpness(specificLoudness,'TimeVarying',true)

Figure contains an axes. The axes with title Time-Varying Sharpness (DIN 45692) contains 2 objects of type line. These objects represent Channel 1, Channel 2.

Звонить acousticFluctuation без каких-либо выходных сигналов для построения графика акустической флуктуации.

acousticFluctuation(specificLoudness)

Figure contains 2 axes and another object of type subplottext. Axes 1 with title \rm{\itfMod} = \{ 24.88, 24.88 \} Hz contains 2 objects of type line. These objects represent Channel 1, Channel 2. Axes 2 contains an object of type surface.

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

fs = 48e3;

fMod = 0.25;
dur = 20;

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

tone = sin(2*pi*t*fMod)';

fc = 1500;
excursionRatio = 0.47;

excursion = 2*pi*(fc*excursionRatio/fs);
audioIn = modulate(tone,fc,fs,'fm',excursion);

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

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

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

Звонить acousticFluctuation без выходных аргументов для построения графика силы акустической флуктуации.

acousticFluctuation(audioIn,fs);

Figure contains 2 axes and another object of type subplottext. Axes 1 with title \rm{\itfMod} = 0.25 Hz contains an object of type line. Axes 2 contains an object of type surface.

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

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

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

fmod = 10.8;
amplitude = 0.15;

osc = audioOscillator('sine',fmod, ...
    "DCOffset",0.5, ...
    "Amplitude",amplitude, ...
    "SampleRate",fileReader.SampleRate, ...
    "SamplesPerFrame",fileReader.SamplesPerFrame);

testSignal = [];
while ~isDone(fileReader)
    x = fileReader();
    testSignal = [testSignal;osc().*fileReader()];
end

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

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

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

Figure contains an axes. The axes contains 2 objects of type line.

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

acousticFluctuation(testSignal,fileReader.SampleRate);

Figure contains 2 axes and another object of type subplottext. Axes 1 with title \rm{\itfMod} = \{ 10.80, 10.80 \} Hz contains 2 objects of type line. These objects represent Channel 1, Channel 2. Axes 2 contains an object of type surface.

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

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

Figure contains 2 axes and another object of type subplottext. Axes 1 with title \rm{\itfMod} = \{ 10.80, 10.80 \} Hz contains 2 objects of type line. These objects represent Channel 1, Channel 2. Axes 2 contains an object of type surface.

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

свернуть все

Звуковой вход, заданный как вектор столбца (моно) или матрица с двумя столбцами (стерео).

Совет

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

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

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

Примечание

Минимальная приемлемая частота дискретизации составляет 8 кГц.

Типы данных: 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

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

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

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

свернуть все

Сила флуктуации в вакууме, возвращаемая в виде вектора 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.008∫z=024ΔL dz (fmod4) + (4fmod)

Где fmod - обнаруженная или известная частота модуляции, а ΔL - воспринимаемая глубина модуляции. Если частота модуляции не указана при вызове acousticFluctuation, он автоматически детектируется посредством выбора пика представления акустической громкости в частотной области. Воспринимаемая глубина модуляции ΔL вычисляется путем пропускания выпрямленных специфических полос громкости через ½-октавные фильтры, центрированные вокруг fmod, за которыми следует фильтр нижних частот для определения огибающей.

Ссылки

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

[2] Цвикер, Эберхард и Х. Фасл. Психоакустика: Факты и модели. 2-е обновление, Springer, 1999.

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

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

.
Представлен в R2020b