Воспринимаемая громкость акустического сигнала
задает ненужный коэффициент калибровки микрофона, используемый для вычисления громкости.loudness
= acousticLoudness(audioIn
,fs
,calibrationFactor
)
задает опции с использованием одного или нескольких loudness
= acousticLoudness(___,Name,Value
)Name,Value
аргументы в виде пар.
loudness = acousticLoudness(audioIn,fs,'Method','ISO 532-2')
возвращает громкость согласно ISO 532-2 (Мур-Глазберг).[
также возвращает определенную громкость.loudness
,specificLoudness
] = acousticLoudness(___)
[
также возвращает процентильную громкость.loudness
,specificLoudness
,perc
] = acousticLoudness(___,'TimeVarying',true)
[
задает ненужные процентили для возврата.loudness
,specificLoudness
,perc
] = acousticLoudness(___,'TimeVarying'
,true,'Percentiles'
,p)
acousticLoudness(___)
без выходных аргументов строит графики определенной громкости и отображает громкость текстово. Если TimeVarying
является true
, строятся как громкость, так и специфическая громкость, с последними в 3-D.
Измерьте 532-1 ISO стационарную громкость свободного поля. Предположим, что уровень записи калиброван так, что тональный сигнал 1 кГц регистрируется как 100 дБ на SPL-метре.
[audioIn,fs] = audioread('WashingMachine-16-44p1-stereo-10secs.wav');
loudness = acousticLoudness(audioIn,fs)
loudness = 1×2
28.2688 27.7643
Создайте два стационарных сигнала с эквивалентной степенью: розовый сигнал шума и белый сигнал шума.
fs = 48e3; dur = 5; pnoise = 2*pinknoise(dur*fs); wnoise = rand(dur*fs,1) - 0.5; wnoise = wnoise*sqrt(var(pnoise)/var(wnoise));
Функции acousticLoudness
использование метода ISO 532-1 (Zwicker) по умолчанию и отсутствие выходных аргументов для построения графика громкости розового шума. Функции acousticLoudness
снова, на этот раз с выходными аргументами, чтобы получить определенную громкость.
figure acousticLoudness(pnoise,fs)
[~,pSpecificLoudness] = acousticLoudness(pnoise,fs);
Постройте график громкости для сигнала белого шума и затем получите определенные значения громкости.
figure acousticLoudness(wnoise,fs)
[~,wSpecificLoudness] = acousticLoudness(wnoise,fs);
Вызовите acousticSharpness
функция для сравнения резкости розового шума и белого шума.
pSharpness = acousticSharpness(pSpecificLoudness);
wSharpness = acousticSharpness(wSpecificLoudness);
fprintf('Sharpness of pink noise = %0.2f acum\n',pSharpness)
Sharpness of pink noise = 2.00 acum
fprintf('Sharpness of white noise = %0.2f acum\n',wSharpness)
Sharpness of white noise = 2.62 acum
Чтение в аудио файла.
[audioIn,fs] = audioread('JetAirplane-16-11p025-mono-16secs.wav');
Постройте график изменяющейся во времени акустической громкости в соответствии с ISO 532-1 и получите процентили. Слушайте аудиосигнал.
acousticLoudness(audioIn,fs,'SoundField','diffuse','TimeVarying',true)
sound(audioIn,fs)
Функции acousticLoudness
снова с теми же входами и получить процентили. Напечатайте Nmax и N5 процентиля. Процентиль Nmax - это максимальная сообщаемая громкость. N5 процентиль - это громкость ниже, которая составляет 95% от сообщаемой громкости.
[~,~,perc] = acousticLoudness(audioIn,fs,'SoundField','diffuse','TimeVarying',true); fprintf('Max loudness = %0.2f sones\n',perc(1))
Max loudness = 89.48 sones
fprintf('N5 loudness = %0.2f sones\n',perc(2))
N5 loudness = 81.77 sones
Чтение в аудио файла.
[audioIn,fs] = audioread('Turbine-16-44p1-mono-22secs.wav');
Функции acousticLoudness
без выходных аргументов для построения графика определенной громкости. Примите коэффициент калибровки 0,15 и давление ссылки 21 микропаскали. Чтобы определить коэффициент калибровки, характерный для вашей аудиосистемы, используйте calibrateMicrophone
функция.
calibrationFactor = 0.15;
refPressure = 21e-6;
acousticLoudness(audioIn,fs,calibrationFactor,'PressureReference',refPressure)
acousticLoudness
позволяет вам задать промежуточное представление, уровни звукового давления, вместо входов во временной области. Это позволяет повторно использовать промежуточные расчеты SPL. Другое преимущество состоит в том, что если ваш физический SPL-счетчик не сообщает о громкости в соответствии с ISO 532-1 или ISO 531-2, можно использовать сообщенные 1/3-октавные SPL для вычисления совместимой со стандартом громкости.
Чтобы вычислить уровни звукового давления из аудиосигнала, сначала создайте splMeter
объект. Вызовите splMeter
объект со звуковым входом.
spl = splMeter("SampleRate",fs,"Bandwidth","1/3 octave", ... "CalibrationFactor",calibrationFactor,"PressureReference",refPressure, ... "FrequencyWeighting","Z-weighting","OctaveFilterOrder",6); splMeasurement = spl(audioIn);
Вычислите средний уровень SPL, пропустив первые 0,2 секунды. Только держите полосы от 25 Гц до 12,5 кГц (первые 28 полос).
SPLIn = mean(splMeasurement(ceil(0.2*fs):end,1:28));
Используя вход SPL, вызовите acousticLoudness
без выходных аргументов для построения графика определенной громкости.
acousticLoudness(SPLIn)
Настройте эксперимент, как указано схемой.
Создайте audioDeviceReader
объект для чтения с микрофона и audioDeviceWriter
объект для записи в динамик.
fs = 48e3; deviceReader = audioDeviceReader(fs); deviceWriter = audioDeviceWriter(fs);
Создайте audioOscillator
объект для генерации синусоиды 1 кГц.
osc = audioOscillator("sine",1e3,"SampleRate",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);
Функции acousticLoudness
с записью микрофона, частотой дискретизации и коэффициентом калибровки. Громкость, о которой сообщают acousticLoudness
- истинное измерение акустической громкости, заданное в 532-1.
loudness = acousticLoudness(micRecording,deviceReader.SampleRate,calibrationFactor)
loudness = 14.7902
Теперь можно использовать коэффициент калибровки, который вы определили, чтобы измерить громкость любого звука, который получен через ту же цепь записи микрофона.
Считывайте аудиосигнал.
[audioIn,fs] = audioread('TrainWhistle-16-44p1-mono-9secs.wav');
ISO 532-1
Определите изменяющуюся во времени конкретную громкость согласно методу по умолчанию (ISO 532-1).
[~,specificLoudness] = acousticLoudness(audioIn,fs,'TimeVarying',true);
ISO 532-1 сообщает об особой громкости над Коркой, где находятся интервалы для коры 0.1:0.1:24
. Преобразуйте интервалы коры в Гц, а затем постройте график определенной громкости по Гц в зависимости от времени.
barkBins = 0.1:0.1:24; hzBins = bark2hz(barkBins); t = 0:2e-3:2e-3*(size(specificLoudness,1)-1); surf(t,hzBins,sum(specificLoudness,3).','EdgeColor','interp') set(gca,'YScale','log') view([0 90]) axis tight xlabel('Time (s)') ylabel('Frequency (Hz)') colorbar title('Specific Loudness (sones/Bark)')
ISO 532-2
Определите стационарную удельную громкость по методу Мура-Глазберга (ISO 532-2).
[~,specificLoudness] = acousticLoudness(audioIn,fs,'Method','ISO 532-2');
ISO 532-2 сообщает об особой громкости по шкале ERB, где 1.8:0.1:38.9
интервалы ERB. Модуль измерения шкалы ERB иногда упоминается как Cam. Преобразуйте интервалы ERB в Гц, а затем постройте график определенной громкости.
erbBins = 1.8:0.1:38.9; hzBins = erb2hz(erbBins); semilogx(hzBins,specificLoudness) xlabel('Frequency (Hz)') ylabel('Loudness (sones)') title('Specific Loudness') grid on
Чтение в аудио файла.
[x,fs] = audioread('WashingMachine-16-44p1-stereo-10secs.wav');
ISO 532-2 позволяет вам задать пользовательский ответ наушника при вычислении громкости. Создайте матрицу 30 на 2, где первый столбец является частотой, а второй - отклонением наушника от плавного ответа.
tdh = [ 0, 80, 100, 200, 500, 574, 660, 758, 871, 1000, 1149, 1320, 1516, 1741, 2000, ... 2297, 2639, 3031, 3482, 4000, 4500, 5000, 5743, 6598, 7579, 8706, 10000, 12000, 16000, 20000; ... -50, -15.3, -13.8, -8.1, -0.5, 0.4, 0.8, 0.9, 0.5, 0.1, -0.8, -1.5, -2.3, -3.2, -3.9, ... -4.2, -4.3, -4.3, -3.9, -3.2, -2.3, -1.1, -0.3, -2, -5.4, -9, -12.1, -15.2, -30, -50 ].';
Вычислите громкость по ISO 532-2. Задайте SoundField
как earphones
и ответ наушника как матрица, которую вы только что создали.
acousticLoudness(x,fs,'Method','ISO 532-2','SoundField','earphones','EarphoneResponse',tdh)
Создайте dsp.AudioFileReader
объект для чтения в кадр за кадром аудиосигнала. Задайте продолжительность системы координат 50 мс. Это будет системой координат продолжительность, в течение которой вы вычисляете стационарную громкость.
fileReader = dsp.AudioFileReader('Engine-16-44p1-stereo-20sec.wav');
frameDur = 0.05;
fileReader.SamplesPerFrame = round(fileReader.SampleRate*frameDur);
Создайте audioDeviceWriter
объект для записи аудио на устройство выхода по умолчанию.
deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);
Создайте timescope
объект для отображения стационарной громкости с течением времени.
scope = timescope( ... 'SampleRate',1/frameDur, ... 'YLabel','Loudness (sones)', ... 'ShowGrid',true, ... 'PlotType','Stairs', ... 'TimeSpanSource','property', ... 'TimeSpan',20, ... 'AxesScaling','Auto', ... 'ShowLegend',true);
В цикле:
Считайте систему координат из аудио файла.
Вычислите стационарную громкость этой системы координат.
Воспроизведите звук через устройство выхода.
Напишите громкость в возможности.
while ~isDone(fileReader) audioIn = fileReader(); loudness = acousticLoudness(audioIn,fileReader.SampleRate); deviceWriter(audioIn); scope(loudness) end release(fileReader) release(deviceWriter) release(scope)
audioIn
- Аудио входАудио вход, заданный как вектор-столбец (моно) или матрица с двумя столбцами (стерео).
Типы данных: single
| double
fs
- Частота дискретизации (Гц)Частота дискретизации в Гц, заданная как положительная скалярная величина. Рекомендуемая частота дискретизации для новых записей составляет 48 кГц.
Примечание
Минимальная допустимая частота дискретизации составляет 8 кГц.
Типы данных: single
| double
calibrationFactor
- Коэффициент калибровки микрофонаsqrt(8)
| положительная скалярная величинаКоэффициент калибровки микрофона, заданный как положительная скалярная величина. Коэффициент калибровки по умолчанию соответствует полномасштабной синусоиде на 1 кГц с уровнем звукового давления 100 дБ (SPL). Чтобы вычислить коэффициент калибровки, характерный для вашей системы, используйте calibrateMicrophone
функция.
Типы данных: single
| double
SPLIn
- Уровень звукового давления (дБ)Уровень звукового давления (SPL) в дБ, заданный как массив 1 на 28 байт- C или массив 1 на 29 байт- C, в зависимости от Method
:
Если Method
установлено в 'ISO 532-1'
, задайте SPLIn
как массив 1 на 28-бай- C, где 28 соответствует одной третьей октавной полосам между 25 Гц и 12,5 кГц, и C количество каналов.
Если Method
установлено в 'ISO 532-2'
, задайте SPLIn
как массив 1 на 29-бай- C, где 29 соответствует одной третьей октавным полосам между 25 Гц и 16 кГц, и C количество каналов.
Для обоих методов вход SPL должен быть измерен с плоским взвешиванием частоты (Z-взвешивание).
Типы данных: single
| double
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
acousticLoudness(audioIn,fs,'Method','ISO 532-2')
'Method'
- Метод расчета громкости'ISO 532-1'
(по умолчанию) | 'ISO 532-2'
Метод вычисления громкости, заданный как 'ISO 532-1'
[1] или 'ISO 532-2'
[2].
Примечание
Только в способе ISO 532-1 выходные данные выдаются для каждого канала независимо, а стационарные сигналы обрабатываются после отбрасывания до первых 0,2 секунд сигнала на выходе внутренних 1/3-октавных фильтров.
Типы данных: char
| string
'TimeVarying'
- Вход изменяется во времениfalse
(по умолчанию) | true
Вход изменяется во времени, задается как true
или false
.
Как задать TimeVarying
на true
, вы должны задать Method
на 'ISO 532-1'
.
Типы данных: logical
'SoundField'
- Звуковое поле аудиозаписи'free'
(по умолчанию) | 'diffuse'
| 'eardrum'
| 'earphones'
Звуковое поле аудиозаписи, заданное как вектор символов или скаляр строка. Возможные значения для SoundField
зависят от Method
:
'ISO 532-1'
– 'free'
, 'diffuse'
'ISO 532-2'
– 'free'
, 'diffuse'
, 'eardrum'
, 'earphones'
Типы данных: char
| string
'EarphoneResponse'
- Реакция наушников[0,0]
(по умолчанию) | M -by-2 матрицаХарактеристика Earphone, заданная как матрица M-на-2 M содержащая пары частотно-амплитуды, которые описывают отклонения earphone от плавного ответа. Форма указана в файле коррекции наушников ISO 11904-1: 2002. Задайте частоту в порядке увеличения в Гц. Задайте амплитудное отклонение в децибелах. Промежуточные значения вычисляются линейной интерполяцией. Значения вне заданной области значений устанавливают в пару ближайшая частота-амплитуда. Значение по умолчанию соответствует плавному ответу.
Чтобы задать EarphoneResponse
, вы должны задать SoundField
на 'earphones'
.
Типы данных: single
| double
'PressureReference'
- Начальное давление (Па)20e-6
(по умолчанию) | положительная скалярная величинаСсылка давление для расчета дБ в паскалях, заданное как положительная скалярная величина. Значение по умолчанию, 20 микропаскалей, является общим значением для воздуха.
PressureReference
используется только для входных сигналов во временной области.
Типы данных: single
| double
'Percentiles'
- Процентилы, при которых вычисляется процентильная громкость[0,5]
(по умолчанию) | вектор со значениями в области значений [0, 100]Процентилы, при которых вычисляется процентильная громкость, заданная как вектор со значениями в области значений [0, 100]. Значения по умолчанию, 0
и 5
, соответствуют N max и N 5 процентилам, соответственно [1].
Процентильная громкость относится к громкости, которая достигается или превышается в X% измеренных временных интервалов, где X является заданным процентилем.
Типы данных: single
| double
'TimeResolution'
- Разрешение по времени выхода'standard'
(по умолчанию) | 'high'
Разрешение по времени выхода, заданное как вектор символов или скалярная строка. Временной интервал 2 мс в 'standard'
разрешение, или 0,5 мс в 'high'
разрешение. Значение по умолчанию является 'standard'
(ISO 532-1 соответствует).
Типы данных: char
| string
loudness
- Громкость (соны)Громкость в сонах, возвращенная как K-на-1 вектор-столбец или K-на-2 матрица независимых каналов. Если TimeVarying
установлено в false
, K равно 1
. Если TimeVarying
установлено в true
, затем громкость вычисляется каждые 2 мс. Если Method
установлено в 'ISO 532-2'
, затем loudness
вычисляется с помощью бинауральной модели и всегда возвращается как вектор- K-на-1 столбец.
specificLoudness
- Специфическая громкостьУдельная громкость, возвращенная как K -by-240-by- C массив или K -by-372-by- C массив. Первая размерность определенной громкости, K, соответствует первой размерности loudness
. Третья размерность удельной громкости, C, соответствует второму измерению loudness
. Второе измерение специфической громкости зависит от Method
используется для вычисления громкости:
Если Method
установлено в 'ISO 532-1'
, затем регистрируется удельная громкость в зонах/коре по шкале от 0,1 до 24 включительно с шагом 0,1.
Если Method
установлено в 'ISO 532-2'
, затем специфическая громкость сообщается в sones/Cam по шкале от 1,8 до 38,9 включительно с шагом 0,1.
perc
- Процентильная громкость (соны)Процентильная громкость в сонах, возвращаемая как p-на-1 вектор или p-на-2 матрица. Количество строк, p, равно количеству Percentiles
.
Процентильная громкость относится к громкости, которая достигается или превышается в X% измеренных временных интервалов, где X является заданным процентилем.
Выходной аргумент percentils действителен только в том случае, если TimeVarying
установлено в true
. Если TimeVarying
установлено в false
, а perc
выход пуст.
Громкость и уровень громкости - это восприимчивые атрибуты звука. Из-за различий среди людей измерения громкости и уровня громкости следует считать статистическими оценщиками. Серия ISO 532 определяет процедуры оценки уровня громкости и громкости, которые воспринимаются лицами с онтологически нормальным слухом при определенных условиях прослушивания.
ISO 532-1 и ISO 532-2 определяют два различных метода вычисления громкости, но оставляют пользователю выбрать соответствующий метод для заданной ситуации.
ISO 532-1: 2017 (E) описывает методы вычисления акустической громкости стационарных и изменяющихся во времени сигналов.
Этот метод основан на DIN 45631:1991. Алгоритм отличается от ISO 532:1975, метод B, указанием коррекций для низких частот.
Схема и шаги обеспечивают высокоуровневый обзор последовательности метода. Для получения дополнительной информации см. раздел [1].
Уровень сигнала временной области регулируется согласно CalibrationFactor
. Следующие шаги алгоритма принимают истинно известный уровень сигнала.
Сигнал преобразуется в представление SPL 1/3 октавы с помощью дробной фильтрации полосы октавы. Блок фильтров состоит из 28 фильтров частотой от 25 Гц до 12,5 кГц. Выход этой ступени находится в дБ и нормирован эталонным давлением.
Низкочастотные полосы 1/3 октавы отменяются в соответствии с фиксированной таблицей взвешивания. Некоторые низкочастотные полосы объединены, чтобы сформировать в общей сложности 20 критических диапазонов.
Уровни критических полос корректируются на пропускную способность фильтра и критический уровень полосы на пороге спокойствия, а затем преобразуются в громкость ядра.
Громкость ядра сопоставлена с интервалы.
Расширение частоты вычисляется с помощью таблицы уровневых и частотно-зависимых склонов.
Громкость вычисляется как интеграл специфической громкости с учетом частотно-расширяющихся склонов.
Этот метод основан на 45631/A1:2010 DIN и предназначен для правильного моделирования длительно-зависимого поведения восприятия громкости для коротких импульсов. Метод изменения во времени звуков является обобщением подхода Цвиккера к стационарным сигналам. Если обобщённая версия применяется к стационарным звукам, то она приводит те же значения громкости, что и необобщённая форма для стационарных сигналов.
Схема и шаги обеспечивают высокоуровневый обзор последовательности метода. Для получения дополнительной информации см. раздел [1].
Уровень сигнала временной области регулируется согласно CalibrationFactor
. Следующие шаги алгоритма принимают истинно известный уровень сигнала.
Сигнал преобразуется в представление SPL 1/3 октавы с помощью дробной фильтрации полосы октавы. Блок фильтров состоит из 28 фильтров частотой от 25 Гц до 12,5 кГц. Выход этой ступени находится в дБ и нормирован эталонным давлением.
Полосы SPL сглаживаются во времени согласно полосзависимым фильтрам.
Низкочастотные полосы 1/3 октавы отменяются в соответствии с фиксированной таблицей взвешивания. Некоторые низкочастотные полосы объединены, чтобы сформировать в общей сложности 20 критических диапазонов.
Уровни критических полос корректируются на пропускную способность фильтра и критический уровень полосы на пороге спокойствия, а затем преобразуются в громкость ядра.
Нелинейный временной распад моделируется с помощью сети диод-конденсатор-резистор. Это моделирует крутое падение восприятия после коротких сигналов по сравнению с длинными сигналами.
Громкость ядра сопоставлена с интервалы.
Расширение частоты вычисляется с помощью таблицы уровневых и частотно-зависимых склонов.
Временное взвешивание применяется для моделирования длительности-зависимости восприятия громкости.
Громкость вычисляется как интеграл специфической громкости с учетом частотно-расширяющихся склонов.
ISO 532-2: 2017 (E) описывает бинауральную модель для вычисления акустической громкости стационарных сигналов. Метод в ISO 523-2 отличается от таковых в ISO 532:1975: он улучшает вычисленную громкость в низкой частотной области значений и бинауральная модель допускает разные звуки для каждого уха. ISO 532-2 обеспечивает хорошее соответствие одинаковым контурам уровня громкости, определенным в ISO 226:2003, и порогу слуха, определенному в ISO 389-7: 2005.
Схема и шаги обеспечивают высокоуровневый обзор последовательности метода. Для получения дополнительной информации см. раздел [2].
Уровень сигнала временной области регулируется согласно CalibrationFactor
. Следующие шаги алгоритма принимают истинно известный уровень сигнала.
Сигнал преобразуется в спектральное представление. Спектральное представление преобразовано согласно фиксированным фильтрам, представляющим передачу звука через tympanic мембрану (барабанная перепонка). Спектр масштабируется в соответствии с ссылкой давлением.
Сигнал преобразуется с помощью модели внутреннего уха. Снова, передаточная функция задается фиксированным фильтром, заданным в стандарте. Выбор фильтра зависит от заданного звукового поля.
Сигнал преобразуется из звукового спектра в шаблон возбуждения на базилярной мембране. Преобразование осуществляется с использованием ряда округло-экспоненциальных фильтров, распространенных по шкале ERB.
Шаблон возбуждения преобразуется в определенную громкость.
Специфическая громкость передается через модель бинарного торможения, где сигнал на одном ухе тормозит громкость, вызываемую сигналом на другом ухе. Выходом от этого этапа является специфическая громкость в sones/ERB.
Специфическая громкость интегрирована по шкале ERB, чтобы придать громкость в сонах.
[1] ISO 532-1: 2017 (E). «Акустика - Методы вычисления громкости - Часть 1: Метод Цвиккера». Международная организация по стандартизации.
[2] ISO 532-2: 2017 (E). "Акустика - Методы вычисления громкости - Часть 2: Метод Мура-Глазберга. Международная организация по стандартизации.
acousticFluctuation
| acousticRoughness
| acousticSharpness
| calibrateMicrophone
| phon2sone
| sone2phon
| splMeter
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.