База ГОСТовallgosts.ru » 13. ОХРАНА ОКРУЖАЮЩЕЙ СРЕДЫ, ЗАЩИТА ЧЕЛОВЕКА ОТ ВОЗДЕЙСТВИЯ ОКРУЖАЮЩЕЙ СРЕДЫ. БЕЗОПАСНОСТЬ » 13.320. Системы аварийной сигнализации и оповещения

ГОСТ Р 56047-2014 Системы охранные телевизионные. Компрессия оцифрованных аудиоданных. Классификация. Общие требования и методы оценки алгоритмов

Обозначение: ГОСТ Р 56047-2014
Наименование: Системы охранные телевизионные. Компрессия оцифрованных аудиоданных. Классификация. Общие требования и методы оценки алгоритмов
Статус: Действует

Дата введения: 09/01/2015
Дата отмены: -
Заменен на: -
Код ОКС: 13.320
Скачать PDF: ГОСТ Р 56047-2014 Системы охранные телевизионные. Компрессия оцифрованных аудиоданных. Классификация. Общие требования и методы оценки алгоритмов.pdf
Скачать Word:ГОСТ Р 56047-2014 Системы охранные телевизионные. Компрессия оцифрованных аудиоданных. Классификация. Общие требования и методы оценки алгоритмов.doc


Текст ГОСТ Р 56047-2014 Системы охранные телевизионные. Компрессия оцифрованных аудиоданных. Классификация. Общие требования и методы оценки алгоритмов



ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ТЕХНИЧЕСКОМУ РЕГУЛИРОВАНИЮ И МЕТРОЛОГИИ


ГОСТР

56047

2014


НАЦИОНАЛЬНЫЙ

СТАНДАРТ

РОССИЙСКОЙ

ФЕДЕРАЦИИ

Системы охранные телевизионные

КОМПРЕССИЯ ОЦИФРОВАННЫХ АУДИОДАННЫХ

Классификация. Общие требования и методы оценки алгоритмов

Издание официальное

Москва

Стенда ртинформ 2015


Предисловие

1    РАЗРАБОТАН Закрытым акционерным обществом «Нордавицд» и Всероссийским научно-исследовательским институтом стандартизации и сертификации в машиностроении (ВНИИНМАШ)

2    ВНЕСЕН Техническим комитетом по стандартизации ТК 234 «Системы тревожной сигнализации и противокриминальной защиты»

3    УТВЕРЖДЕН И ВВЕДЕН В ДЕЙСТВИЕ Приказом Федерального агентства по техническому регулированию и метрологии от 30 июня 2014 г. N9 677-ст

4    ВВЕДЕН ВПЕРВЫЕ

Правила применения настоящего стандарта установлены в ГОСТ Р 1.0—2012 (раздел 8). Информация об изменениях к настоящему стандарту публикуется в годовом (по состоянию на 1 января текущего года) информационном указателе «Национальные стандарты». а официальный текст изменении и поправок — в ежемесячно издаваемом информационном указателе «Национальные стандарты». 6 случае пересмотра (замены) или отмены настоящего стандарта соответствующее уведомление будет опубликовано в ближайшем выпуске ежемесячного информационного указателя «Национальные стандарты». Соответствующая информация, уведомление и тексты размещаются также в информационной системе общего пользования — на официальном сайте Федерального агентства по техническому регулированию и метрологии (gosl.ru)

© Стандартинформ. 2015

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

и

Содержание

Приложение А (обязательное) Математическое описание алгоритмов расчета метрик оценки

Б.5 Листинг программы расчета метрики «Коэффициент различия форм сигналов»

Б.6 Листинг программы расчета метрики «Коэффициент различия форм сигналов» на языке С . . 90

in

Введение

Активное применение в системах охранных телевизионных (СОТ) методов компрессии оцифрованных аудиоданных, заимствованных из мультимедийных применений телевидения. из-за низкого качества восстановленных после компрессии оцифрованных аудиоданных привело к невозможности осуществления следственных мероприятий, а также оперативных функций, с использованием отдельных СОТ.

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

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

Методика классификации алгоритмов компрессии оцифрованных аудиоданных, приведенная в настоящем стандарте, основана на оценке качества восстановленных аудиоданных, с учетом психоакустических особенностей человеческого слуха. Этот подход к оценке качества восстановленных аудиоданных рекомендован Сектором радиосвязи Международного союза электросвязи (МСЭ-Р). членом которого является Российская Федерация.

НАЦИОНАЛЬНЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИ

Системы охранные телевизионные

КОМПРЕССИЯ ОЦИФРОВАННЫХ АУДИОДАННЫХ

Классификация. Общие требования и методы оценки алгоритмов

Video surveillance systems. Digital audio data compression. Classification. General requirements and evaluation algorithm methods

Дата введения — 2015—09—01

1    Область применения

Настоящий стандарт распространяется на цифровые системы охранные телевизионные (далее — ЦСОТ) и устанавливает классификацию, общие требования и методы оценки алгоритмов компрессии оцифрованных аудиоданных.

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

Настоящий стандарт применяют к алгоритмам компрессии и декомпрессии аудиоданных независимо от их реализации на аппаратном уровне.

Настоящий стандарт применяют совместно с Г ОСТ Р 51558.

2    Нормативные ссылки

8 настоящем стандарте использованы нормативные ссылки на следующие стандарты:

ГОСТ 15971 Системы обработки информации. Термины и определения

ГОСТ Р 51558 Средства и системы охранные телевизионные. Классификация. Общие технические требования. Методы испытаний

Примечание — При пользовании настоящим стандартом целесообразно проверить действие ссылочных стандартов а информационной системе общего пользования — на официальном сайте Федерального агентства по техническому регулированию и метрологии а сети Интернет или по ежегодному информационному указателю и Национальные стандарты», который опубликован по состоянию на 1 января текущего года, и по выпускам ежемесячного информационного указателя «Национальные стандарты» за текущий год. Если заменен ссылочный стандарт, на который дана недатированная ссылка, то рекомендуется использовать действующую версию этого стандарта с учетом всех внесенных е данную версию изменений. Если ссылочный стандарт отменен без замены, то положение, а котором дана ссылка на него, рекомендуется применять а части, не затрагивающей эту ссылку.

3    Термины и определения

8 настоящем стандарте применены термины по ГОСТ 15971 и следующие термины с соответствующими определениями:

3.1 алгоритм быстрого преобразования Фурье (БПФ) (fast Fourier transform. FFT): Набор алгоритмов, реализация которых приводит к существенному уменьшению вычислительной сложности дискретного преобразования Фурье (ДПФ).

Примечание — Смысл быстрого преобразования Фурье состоит а том. чтобы разбить исходный N-отсчетный сигнал х(п) на дав более коротких сигнала, дискретные преобразования Фурье которых могут быть скомбинированы таким образом, чтобы получить дискретное преобразования Фурье исходного N-отсчетного сигнала.

Издание официальное

3.2    алгоритм декомпрессии (decompression algorithm): Точный набор инструкций и правил, описывающий последовательность действий, согласно которым сжатые аудиоданные преобразуются в восстановленные, реализуемый при помощи аудио декодера.

3.3    алгоритм компрессии (compression algorithm): Точный набор инструкций и правил, описывающий последовательность действий, согласно которым исходные аудиоданные преобразуются в сжатые. реализуемый при помощи аудио кодера.

3.4    амплитудно-временная метрика (time-amplitude metric): Метрика качества, основанная на сравнении оцифрованных и восстановленных аудиоданных по форме волны.

3.5    аналого-цифровой преобразователь, АЦП (analog-to-digital converter. ADC): Устройство, преобразующее входной аналоговый аудиосигнал в оцифрованные аудиоданные.

3.6    аудио декодер (audio decoder): Программные, аппаратные или аппаратно-программные средства, с помощью которых осуществляется декомпрессия сжатых аудиоданных.

3.7    аудио кодер (audio encoder): Программные, аппаратные или аппаратно-программные средства. с помощью которых осуществляется компрессия оцифрованных аудиоданных.

3.8    аудиоданные (audio data), аудиосигнал (audio signal), монокаиальный аудиосигнал (mono channel audio): Аналоговый сигнал, несущий информацию об изменении во времени амплитуды звука.

3.9    битрейт (bitrate): Выраженная в битах оценка количества сжатых аудиоданных, определенная для некоторого временного интервала и отнесенная к длительности выбранного временного интервала в секундах.

3.10    восстановленные аудиоданные (recovered audio data): Данные, полученные из сжатых аудиоданных после их декомпрессии.

3.11    декомпрессия сжатых аудиоданных (decompression of compressed digitized audio data): Восстановление оцифрованных данных из сжатых аудиоданных.

3.12    дискретное преобразование Фурье, ДПФ (discrete Fourier transform, DFT): Преобразование. ставящее в соответствие N отсчетам дискретного сигнала N отсчетов дискретного спектра си гнала.

3.13    дифференциация (differentia): Выделение частного из общей совокупности по некоторым признакам.

3.14    искаженный фрейм (distorted frame): Фрейм, для которого максимальное отношение шума к порогу маскирования превышает 1.5 дБ.

3.15    искусственная нейронная сеть (artificial neural network. ANN): Модель биологической нейронной сети, которая представляет собой сеть элементов — искусственных нейронов — связанных между собой синаптическимисоединениями.

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

3.16    качество восстановленных аудиоданных (decoded audiodata quality): Объективная оценка соответствия восстановленных аудиоданных исходным оцифрованным аудиоданным на основе рассчитанных метрик качества.

3.17    кодек аудиоданных (audio codec): Программный, аппаратный или аппаратно-программный модуль, способный выполнять как компрессию, так и декомпрессию аудиоданных.

3.18    компрессия (сжатие) оцифрованных аудиоданных (digit2ed audio data compression): Обработка оцифрованных аудиоданных с целью уменьшения их объема.

3.19    компрессия оцифрованных аудиоданных без потерь (lossless digitized audio compression): Обработка оцифрованных аудиоданных, при которой не происходит потери информации, вследствие чего восстановленные (в результате выполнения декомпрессии) оцифрованные аудиоданные не отличаются от исходных оцифрованных аудиоданных.

3.20    компрессия оцифрованных аудиоданных с потерями (lossy compression of digitized audio data): Обработка оцифрованных аудиоданных, при которой происходит потеря информации, и вследствие этого восстановленные (в результате выполнения декомпрессии) оцифрованные аудиоданные отличаются от исходных оцифрованных аудиоданных.

3.21    метод оценки алгоритма компрессии (evaluation method of compression algorithm): Метод аналитического определения значений метрик качества на соответствие требованиям, предъявляемым к алгоритмам компрессии аудиоданных.

3.22    метрика качества (quality metric): Аналитически определяемые параметры, характеризующие степень отклонения восстановленных аудиоданных от исходных оцифрованных аудиоданных.

3.23    многоканальный аудиосигнал (multi-channel audio): Аудиосигнал, состоящий из объединения определенного количества аудиосигналов (каналов), которые несут информацию об одном и том же звуке.

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

3.24    окно (window): Весовая функция, которая используется для управления эффектами, обусловленными наличием боковых лепестков в спектральных оценках (растеканием спектра).

Примечание — Имеющуюся конечную запись данных или имеющуюся конечную корреляционную последовательность удобно рассматривать как некоторую часть соответствующей бесконечной лоследоветельности. видимую через применяемое окно.

3.25    оконное преобразование Ханна (short-time FouriertransformwithHann window): Дискретное преобразование Фурье с весовой функцией — окном Ханна.

3.26    оцифрованные аудиоданные (digitized audio data): Данные, полученные путем аналогоцифрового преобразования аудиоданных, представляющие собой последовательность байтов в некотором формате (WAV или др.).

3.27    передискретизация аудиосигнала (resampling): Изменение частоты дискретизации аудиосигнала.

3.28    пиковое отношение сигнал/шум (peak-to-peak signal-to-noise ratio): Соотношение между максимумом возможного значения сигнала и мощностью шума.

3.29    порог маскирования (masking threshold): Пороговый уровень сигнала, не различаемого человеком из-за эффекта психоакустического маскирования.

3.30    психоакустическая модель (psychoacoustics model): Модель для сжатия аудиоданных с потерями, использующая особенности восприятия звука человеческим ухом.

3.31    психоакустическое маскирование (psychoacoustics masking): Подавление (сокрытие) при определенных условиях одного звука другим звуком из-за особенностей восприятия звука человеческим ухом.

3.32    разрядность АЦП (resolution of ADC): Количество бит. которым кодируется каждый отсчет сигнала в процессе АЦП.

3.33    сжатые аудиоданные (compressed audio data): Данные, полученные путем компрессии оцифрованных аудиоданных.

3.34    спектр сигнала (frequency spectrum): Результат разложения сигнала на простые синусоидальные функции (гармоники).

3.35    спектрограмма (spectrogram): Характеристика плотности мощности сигнала в частотно-временном пространстве.

3.36    степень сжатия (compressionratio): Коэффициент сокращения объема оцифрованных аудиоданных в результате компрессии.

3.37    стереофонический двухканальный аудиосигнал (stereophonic audiosignal). стерео аудиосигнал (stereo audio signal), двухканальный аудиосигнал (two-channel audio signal): Многоканальный аудиосигнал, состоящий из двух моноканальных аудиосигналов.

3.38    формат оцифрованных аудиоданных (digitized audio data format): Представление оцифрованных аудиоданных, обеспечивающее их обработку цифровыми вычислительными средствами.

3.39    фрейм (frame): Фрагмент звукового сигнала с заданным количеством значений (длиной фрейма).

3.40    частота дискретизации (sample rate): Частота взятия последовательных значений непрерывного во времени сигнала при его аналого-цифровом преобразовании в оцифрованные аудиоданные.

3.41    частотно-временная метрика (time-frequency metric): Метрика качества, основанная на сравнении спектрограмм оцифрованных и восстановленных аудиоданных.

3.42    шум (noise): Совокупность апериодических звуков различной интенсивности и частоты, не несущая полезную информацию.

4 Общие требования

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

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

4.3    Качество звукового фрагмента восстановленных аудиоданных определяют по значениям метрик качества алгоритмов компрессии оцифрованных аудиоданных (далее — метрики качества), харак-

з

териэующих степень искажения восстановленных после сжатия аудиоданных в сравнении с исходными оцифрованными аудиоданными. Описание метрик приведено в разделе 6 настоящего стандарта, а порядок их расчета приведен в приложении А.

4.4 Алгоритмы компрессии оцифрованных аудиоданных относят к одному из трех классов, установленных в разделе 5 настоящего стандарта.

5 Классификация

5.1 Класс алгоритма компрессии оцифрованных данных определяют по рассчитанным для него значениям метрик качества. Для оценки качества восстановленных аудиоданных и классификации алгоритмов компрессии используют метрики качества, указанные в таблице 1.

Таблица 1 — Диапазоны значений метрик качества по классам алгоритмов компрессии оцифрованных аудиоданных

Метрика качества

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

Класс III

Класс II

Класс I

Пиковое отношен ив сигмал/шум (PSNR). дБ

Менее 30

(30; 40)

Свыше 40

Коэффициент различия форм сигналов

Более 10'4

о

о

МеиееЮ'*

Объективная оценка аудиоданных с точки зрения восприятия (РЕАО)

(-3.98; -2.3)

(-2.3; -0.62)

(-0.62: 0.22)

Примечание — Метрики качества отражают изменения оцифрованных аудиоданных (после их обработки алгоритмами компрессии и декомпрессии), которые могут оказать критическое впияиие на возможность испопьзования восстановленных аудиоданных для установления наличия звуковых сигналов, дифференциации звуков и речи.

5.2    В зависимости от значений метрик качества, вычисленных в ходе проведения их оценки, алгоритм компрессии оцифрованных аудиоданных относят к одному из классов:

•    класс III — алгоритмы компрессии, обеспечивающие качество восстановленных аудиоданных, достаточное для установления наличия звуковых сигналов и не уступающее в этом качеству исходных аудиоданных, но создающее помехи при дифференциации звуков, понимании речи.

- класс II — алгоритмы компрессии, обеспечивающие качество восстановленных аудиоданных, достаточное для установления наличия звуковых сигналов, дифференциации звуков, речи и не уступающее в этом качеству исходных аудиоданных, но отличимое от качества исходных аудиоданных;

•    класс I — полнофункциональные алгоритмы компрессии, обеспечивающие качество восстановленных аудиоданных, неотличимое от качества исходных аудиоданных.

5.3    Значения метрик качества определяют для каедого звукового фрагмента (длиной 5 с) оцифрованных аудиоданных, а в качестве результирующей оценки восстановленных аудиоданных выбирают наименьшее значение для метрик PSNR и PEAQ и наибольшее значение для коэффициента различия форм сигналов.

Для расчета метрик PSNR и коэффициента различия форм сигналов исходные и восстановленные цифровые аудиоданные должны быть представлены с частотой дискретизации 44100 Гц. 16 битами памяти на одно дискретное значение выборки и с одним звуковым каналом. Длина звукового фрагмента 5 с должна включать в себя 220500 оцифрованных значений.

Для расчета метрики PEAQ исходные и восстановленные цифровые аудиоданные должны быть представлены с частотой дискретизации 48000 Гц. 16 битами памяти на одно дискретное значение выборки и с одним или с двумя звуковыми каналами. Длина звукового фрагмента 5 с должна включать в себя 240000 оцифрованных значений для каждого канала.

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

5.4    Алгоритмы компрессии следует различать по степени сжатия, выражаемой через коэффициент сжатия. Коэффициент сжатия определяют как отношение объема исходных несжатых данных к объему сжатых данных [порядок расчета данной метрики выполняют в соответствии с А.4 (приложение А)].

8 зависимости от значения коэффициента сжатия алгоритмы компрессии аудиоданных подразделяют на:

•    алгоритмы с высокой степенью сжатия — коэффициент сжатия более 42;

•    алгоритмы со средней степенью сжатия — коэффициент сжатия от 15 до 42 включительно;

•    алгоритмы с низкой степенью сжатия — коэффициент сжатия менее 15.

6 Методы оценки алгоритмов компрессии

6.1 Общее описание методов оценки

Общая схема работы ЦСОТ при использовании алгоритмов компрессии и декомпрессии представлена на рисунке 1.

Рисунок 1 — Общая схема работы ЦСОТ

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

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

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

В соответствии с представленной общей схемой работы ЦСОТ классификацию алгоритмов компрессии оцифрованных аудиоданных осуществляют путем оценки метрик качества восстановленных аудиоданных от исходных оцифрованных аудиоданных. В зависимости от особенностей технической реализации конкретной ЦСОТ существует два метода оценки: с разделением оцифрованных аудиоданных и с разделением аудиоданных.

Перед оценкой значений метрик качества оба аудиосигнала (исходный и восстановленный) должны быть преобразованы в сигналы с частотой дискретизации 44100 и 48000 Гц. Для указанных частот количество бит. приходящееся на одно дискретное оцифрованное значение, должно быть равным 16.

6.1.1 Метод оценки алгоритма компрессии на основе разделения оцифрованных аудиоданных

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

Рисунок 2 — Обшей схема реализации метода оценки на основе разделений оцифрованных аудиоданных

Общая схема реализации метола оценки алгоритма на основе разделения оцифрованных аудиоданных представлена на рисунке 2.

Оценку алгоритма выполняют в последовательности:

-    на вход испытуемой ЦСОТ подают последовательные аудиоданные:

-    оцифрованные и восстановленные аудиоданные сохраняют на устройствах хранения;

•    выполняют расчет значений метрик качества и осуществляют классификацию алгоритма компрессии по таблице 1. Описания метрик приведены в 6.2—6.5. Метрики должны быть рассчитаны в соответствии с приложением А.

6.1.2 Метод оценки алгоритма компрессии на основе разделения аудиоданных

Метод оценки алгоритма компрессии на основе разделения аудиоданных следует применять в случае. если техническая реализация ЦСОТ не позволяет применять метод оценки на основе разделения оцифрованных аудиоданных. Применение данного метода требует наличия дополнительной ЦСОТ в составе испытательного стенда, которая предназначена для сохранения оцифрованных аудиоданных.

Общая схема реализации метода оценки на основе разделения аудиоданных представлена на рисунке 3.

Оценку алгоритма компрессии выполняют в последовательности:

-    на вход испытуемой ЦСОТ подают последовательные аудиоданные, которые автоматически дублируются на другую ЦСОТ посредством делителя аудиосигнала, являющегося элементом испытательного стенда:

•    восстановленные аудиоданные сохраняют на устройствах хранения ЦСОТ:

•    оцифрованные аудиоданные сохраняют на устройствах хранения с использованием возможностей второй ЦСОТ (из состава испытательного стенда):

•    выполняют расчет значений метрик качества и осуществляют классификацию алгоритма компрессии по таблице 1. Описания метрик приведены в 6.2—6.5. Метрики должны быть рассчитаны в соответствии с приложением А.

Рисунок 3 — Общая схеме реализации метода оценки алгоритма компрессии на основе разделения аудиоданных

6.2    Метрика PEAQ

6 2.1 Метрика РЕАО предназначена для оценки качества обработанного сигнала относительно исходного с учетом слуховых особенностей человека (психоакустической модели). Метрика должна быть рассчитана в соответствии с А.1 (приложение А).

6 2.2 Для расчета метрики PEAQ к аудиосигналам предъявляют следующие требования:

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

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

6.3    Метрика PSNR

6 3.1 Метрика PSNR выражает количественную характеристику отношения энергии шума (искажений). вносимого процессом кодирования, к максимально возможной энергии исходного сигнала. Значения метрики PSNR измеряют в децибелах. Метрика должна быть рассчитана в соответствии с А.2 (приложение А).

6.3.2 Для расчета метрики PSNR к аудиосигналам предъявляют следующие требования:

•    исходный и восстановленный аудиосигналы должны иметь частоту дискретизации равную 44100 Гц. Для сигналов с частотой, отличной от указанной, необходимо предварительно выполнить передискретизацию аудиосигнала:

- если исходный и восстановленный аудиосигналы многоканальные, то используют только один канал исходного аудиосигнала и соответствующий ему один канал восстановленного аудиосигнала.

6.4    Метрика «коэффициент различия форм сигналов»

6.4.1 Разница соседних последовательных значений амплитуд исходного аудиосигнала, полученных в результате импульсно-кодовой модуляции, и разница соседних последовательных значений амплитуд восстановленного аудиосигнала определяют соответственно форму исходного аудиосигнала и форму восстановленного аудиосигнала в последовательные моменты времени. Конечное значение метрики «коэффициента различия форм сигналов» подсчитывают как суммарную среднеквадратичную ошибку между формой исходного аудиосигнала и формой восстановленного аудиосигнала. Метрика должна быть рассчитана в соответствии с А.З (приложение А).

6.4.2 Для расчета метрики «коэффициент различия форм сигналов» к аудиосигналам предъявляют следующие требования:

•    исходный и восстановленный аудиосигналы должны иметь частоту дискретизации равную 44100 Гц. Для сигналов с частотой, отличной от указанной, необходимо предварительно выполнить передискретизацию аудиосигнала;

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

6.5 Метрика «коэффицент сжатия»

6.5.1    Метрика «коэффициент сжатия»предназначена для характеристики качества алгоритма компрессии сточки зрения уменьшения объема занимаемой исходными аудиоданными памяти после их обработки алгоритмом сжатия. Метрика должна быть рассчитана в соответствии с А.4 (приложение А).

7 Методы сравнения алгоритмов компрессии оцифрованных аудиоданных

7.1    Два и более алгоритмов компрессии сравнимы друг с другом, если они принадлежат одному и тому же классу в соответствии с таблицей 1.

7.2    Из двух и более сравниваемых алгоритмов компрессии лучшим признают алгоритм, обеспечивающий лучшие значения хотя бы двух из трех метрик, приведенных в таблице 1. Лучшим значением метрики признают большее значение — для метрик PSNR и PEAQ и меньшее значение — для метрики «коэффициент различия форм сигналов». Если сравниваемые алгоритмы имеют одинаковые значения метрик качества, приведенных в таблице 1. то лучшим считают алгоритм с наибольшей степенью сжатия. определяемой коэффицентом сжатия по 6.5.

Приложение А

(обязательное)

Математическое описание алгоритмов расчета метрик оценки качества алгоритмов компрессии аудиоданных

А.1 Алгоритм расчете метрики РЕАО

А.1.1 Обозначения, используемые в алгоритме:

Ft ■ 48000 Гц— частоте дискретизации сигналов:

Nf • 2048— количество оцифрованных значений сигнала, определяющих длину звукового фрагмента (размер фрейма):

х[л] — оцифрованные данные фрейма, где л — целое число, представляющее собой индекс конкретного значения амплитуды сигнала внутри звукового фрагмента (фрейма), л с (О. Nf - 1 ].

покадровый шаг вперед: NfJl ■ 1024. таким образом перекрытие фреймов составляет 50 %;

Fgt * Ft/1024 — частота выборки кадров с учетом покадрового шага:

Nc ■ 109 — количество частотных полос фильтрации.

А.1.2 Расчет метрики должен состоять из пяти этапов.

I    — предварительная обработка сигналов:

II    — обработка образов:

III    — расчет выходных значений пси хоа кус ты чес кой модели:

IV    — нормирование значений выходных переменных психоакустической модели:

V    — оценка качества восстановленного сигнала с помощью искусственной нейронной сети.

А.1.2.1 Предварительная обработка сигналов

А.1.2.1.1 Применение оконного преобразования

Исходные оцифрованные данные разбивают на фреймы. Оцифрованные данные каждого фрейма подвергают масштабированному оконному преобразованию Ханна. t\w, по формуле

\ И*    (л. МД    (А.1)

где Л(л. — функция, рассчитываемая по формуле


(А.2)

Переход в частотную область осуществляют путем применения дискретного преобразования Фурье (ДПФ) X (А) по формуле

ч, -У


*1*1*тг 1Ли, и* 1"|в

пгО


<А.З)


где 0 s к s Np - 1:

у — мнимая единица.

А.1.2.1.2 Модель наружного и среднего уха

Частотную характеристику наружного и среднего уха VV(f) вычисляют по формуле

(А.4)


W(/) ■ ю****'**0.

где 1 — частота, заданная в кГц. a Ai0{f) вычисляют по формуле

A if) * -2.184


(юоо)


0 в


6.5 е


>V ——з.з|    / f “

) _ 0>оо1 _!_]    .

hoooj


(A.S)


По формуле (А.4) вектор весовых коэффициентов W |Х| вычисляют следующим образом:

W [к] ш w


(А.6)

А . N. где 0 zk z—U 2

Используя веса, рассчитанные по формуле (А.6). вычисляют взвешенную энергию ДПФ |Хпо формуле:

I*,!*)!1 * G.V1!*!!* |*)|J.    (А.7>

где 0 s к й

2

2.794-10°.

А. 1.2.1.3 Разложение критической полосы слуха

Для преобразования частоты сигнала в высоту звука используют шкалу Барка. Расчет следует производить по формуле (А.б), для обратного преобразования — по формуле (А.9)

2 > в(0 - 7 sslnh (0650).    (А.8)

где 2 — высота звука, измеряемая в Барках.

9 ■ e*'(2) * 6S0sinh(2 /7).    (А.9)

Полосы частот определяют заданием нижней, центральной и верхней частот каждой полосы и их значение по шкапе Барка определяют по формулам

(А.10)

*.м

2l ♦(/ ♦ 1 )Д2.


t + 1S


М


(А.11)


в остальных случаях.


(А. 12)


(А. 13) (А.14} (A.1S)


(А.16}


2 ‘

где Л2 ■ 1/4;

^ • в(^>:

fL ■ 80 Гц;

Fu ■ 18 кГц.

Обратное преобразование выполняют по формулам

/я-в'да).

yo-e-4*«M>

где/» 1,2.....Ыс * 109.

Вклад энергии от *-ой основной частоты ДПФ U|/. Jr) для i-й полосы частот вычисляют по формуле

U\>. к\


так °-т,п ('•1,|-^г1£)    >

--ZZ-

N,

Энергию hй полосы частот £,|i| вычисляют по формула

я.|*И

SlX.lfcl'-TO.HlX.lfcJjBI*.    (А.17}

* м>и

греиД/j - Ot/.АДОК и Jit) ш U(/.AJJD.

Конечную формулу энергии i-й полосы частот £Л(/) вычисляют по формуле

е„(М • ma*(£j} J. £„J.    <А.18}

А.1.2.1.4 Внутренний шум уха

Для компенсации внутренних шумов в самом ухе. следует ввести надбавочное значение £^(/1 для энергии каждой полосы частот. £(;):

£|J J •£.[/)♦

где внутренний шум £/Д| (i ) моделируют спедуюшим образом.

I    1.4S6(//tOOO)-0\


Энергии £|i) — образы высоты.

А.1.2.1.5 Энергия распространения а пределах одного фрейма

Характеристику энергии распространения а шкале Варка £Ji) рассчитывают по формуле


где eji| — характеристика рассчитываемая по формуле


вЛ *| £<S«.<•£(<)»’*j.


где £(J| — надбавочные значения энергий из (А. 19):

£(0) устанавливают рваным 1.

S(i. /. £) — характеристика рассчитываемая по формуле


I 1

|4<П)


(10' ,4т'.


1st.


S(i. К £)


1-7


т


i It.

Л/ s t.


(А.20)

(А.21)

(А.22)

(А.23)


где (для упрощения записи выражения) aL • 102 7хг. ви ■ 10"2 4 и;

iixt

ас(0-Ю /«|";

в£ - £°^.

Тогда А'1 (/. £) преобразуется по формуле

7    ЛГ, -I


кО    1*7


г 1-(auac[<]fltlg»<,< ’-1 i-V t-euac|/|a,(£>


Слагаемые £eJij и £й0|/)изформулы(А.21) вычисляют по формулам


где I ■ N0 - 2.....0.


EJI* 1)


4 (».£(/J)j


04


Энергии £s|i) а дальнейшем а тексте стандарта — образы нераспространенных возбуждений.

А. 1.2.1.6 Фильтрация энергии Фильтрацию энергии вычисляют по формулам

£,(Г. «]-<.(/ |Е,|/. й - 1] • <1 - и (0)£,(<. п].

ё,М)«тах (£,{/, nl.EJi. л|)

где п — индекс фрейма (фреймы проиндексированы, начиная с л ■ 0);

£Л[К л) — энергия п-ro фрейма, соответствующая формуле (А.21);

u(/J — постоянная времени для угасающей энергии Начальное условие для фильтрации: £г[/. -1] ■ 0. £s|j. л) — конечные значения (образы возбуждений а дальнейшем)


(А.24)

(А.25)

(А.26) (А.27)

(А.28) (А.29)


А1.2.1.7 Постоянные времени

Постоянную времени г (/) для фильтрации i-й полосы вычисляют по формуле

(А.30)


юо,

'w ’“-т"

0.03 с;

* mme 0.008 С.

Постоянную времени для угасающей энергии а (>] следует вычислять по формуле

а [/ J ■ ехр


(А.31)


На рисунке А.1 приведена схема предварительных вычислений.


РисуиокА.1 — Схема предварительных вычислений

Индексами R и 7 обозначают исходный и восстановленный аудиосигналы соответственно. Индексом к обозначают индекс полосы частот (всего 100 лолосчастот), а индексом л — номер фрейма. Для рекуррентных формул на этом этапе и этапе III всегда выбирают нулевые начальные условия.

А.1.2.2 Обработка образов

А.1.2.2.1 Обработка образов возбуждений

Входными данными для этой стадии вычислений являются образы возбуждений    n\*EsT{k. л], рассчиты

ваемые по формулам (А.28) и (А.20) для исходного и аосстаноаленного аудиосигналов соответственно.

Коррекция образов возбуждений

Сначала осуществляют фильтрацию для обоих аудиосигналов по формулам

РД*. П\ « а |*)Я„(*. Л — II ♦ (1 — а    Л).    (А 32)

Р,[к. Я) • а |*|Р, |*. Л - 1) • (1 - а (*)£.,(*. П).    (А.33)

* 0.008с.


(А.34)


(А.35)


(А.36)


где и (/) — постоянная времени, рассчитываемая по формулам (А.30) и (А.31). но при т100 ■ 0.03с. г, Начальное условие для фильтрации выбирают рваным 0.

Далее вычисляют коэффициент коррекции. С^|л):

-1-

j    I'M*.»)    I

Образы возбуждений. £(А. л] и ЕLT (А, л), корректируют по формулам

|£.д|К.л). с.|л|4 1

|е.,|*.л)С1(л), C.Hsl

Адаптация образов возбуждений

Используя те же постоянные времени и начальные условия, что и при коррекции образов возбуждений, выходные сигналы, рассчитанные по формулам (A.3S) и (А.36). сглаживают а соответствии с формулами

*„1*. *\ * « (*)*„(*. л - 1| ♦ E^k. n)ELM[k. л).    (А.37)

PJA. л] ■ и (AJPJA. л - 1) ♦ EJik. л^А. л).    (А.38)

На основе соотношения между рассчитанными а формулах (А.Э7) и (А.38) значениями вычисляют перу вспомогательных сигналов:

«„I*.»)


1.    Я„1*,л|гЯ,|*.л},

Я.|*.»|<Я,|*.л).

Я,|*.л)


(А.39)


(А.40)


и.


*в(*.л]*Я,|А.л|.

^й(Лг.л]<^(Л.л|.


Если а формулах (А.39) и (А.40) числитель и знаменатель равны нулю, то необходимо выполнить действия:

ЯГ(А. л| ■ ЯГ(А- 1. л] и R^k. л] ■ RJjk - 1. л).    (А.41)

Если к ■ 0. то (Л. л) ■ Rf^k, л| ■ 1.    (А.42)

С целью формирования множителей для коррекции образов вспомогательные сигналы подвергают фильтрации с использованием тех же постоянных времени и начального условия, что и а формулах (А.32) и (А.33):

п\ ш а Iл - 1) Ml - а |*]ЯвЛ||. л).    (А.43)

?с,I*. п) « « 1*|РСТ|*. Л - 1) ♦ (1 - u [А])*,, |i. Л|.    (А.44)

где


RJk. л) RJk. л)


1

М,|Ас)т М2[*) + 1 1

мдк)7мд5Гм


4»Ма|«|

I л*М1

£ *гМ1


• *-Л4.|Д)


(А.45)


(А.46)


М,|Дс| « min <3. Ас), ЛАДАс( ■ min (4, Nt - 1 - *).    (А.47)

Конечным результатом этой стадии обработки, на основе формул (А.43)и (А.44) получают спектрально адаптированные образы. £РГ(Ас. п\ и Тр^к. л), по формулам

£РГ (Ас. л| • £lf (Аг. nJPcr(Ar. л).    (А.46)

ЕрА*- п) *    njP^Ac. л).    (А.49)

А.1.2.2.2 Обработка образов модулядии

Входными данными для этой стадии вычислений являются образы иераспростраиенных возбуждений I*. га) и £jr(Ac. п|. которые рассчитывают по формуле (А.21) для исходного и восстановленного аудиосигналов соответственно. Вычисляют меры модуляций огибающих спектра.

Предварительно вычисляют среднюю громкость,£*(*. л)и£ г(Аг. л) по формулам

Ё>. />) ■ a |*|£>. П - 11 * (1 - а [*))<£Л(А. />])“    (A.S0)

£,|Х. П] « и (*|£,|*. Л - 1J ♦ (1 - а [(Г|К£|*. Л|)<4    (А.51)

Дал** необходимо вычислить ра мости D    п\ и О , [X. л):

D JAc, nj - u (AtjDjAr. п - 1) ♦ (1 - a |*])£J(£^. *))** - (£JAc. л - 1)П. О,(Ас. л) - « |*р>. л - 1) М1 - « [А0)Г J(£„(Ac,    - (£ г (Ас. л - 1))^(.

Постоянные времени и начальные условия используют те же самые, что и в А.1.2.2.1. Меры модуляции огибающих спектре вычисляют по формулам

0*1Ас.л|


(A.S2) (А.53)


MJAC. л)


W £д[Ас,л(/0,3


(А 54)


Мг[к. л]


Ог[А./>)

1ч £; (Ас. л J/03


(А.55)


А.1.2.2.3 Вычисление громкости

Образы громкости вычисляют в соответствии с формулами

(A.S6)

(A.S7)

где с « 1,07664.


з^(/) • -2 - 2,05 a tan


Ш_075*,*л[Г-Ц,’|.

Uoooj    (I1600J )


(A.S6)


(А.59)


S(Af|.10^^,fc|,,000,‘°V

£^(0 ■ 3.64 - (АП ООО)*0*,    (А.60)

£,(*( « Ю£мв,г|А1,ло.    (А.61)

Общие громкости для обоих сигналов вычисляют ло формулам

ИлиИ * V*'Nc) X>* («л(*. п].0).    <А62>

мо Ч 1

tywiH * (24/лд £max(Af7(A. />).0).    (А 63)

4-0

А.1.2.3 Расчет выходных значений психоакустической модели А.1.2.3.1 Общее описание процесса расчета параметров

Выходные характеристики из А. 1.2.1 используют для вычисления выходных хврактеристик А.1.2.2 в соответствии со схемой, приведенной на рисунке А.2.

Образы возбуждении    Образы нвраспространенных

возбуждений

Спектрально    Общая    Меры    Модофици-

адаптированные    громкость    модуляции    рованные

образы    образы

Рисунок А.2 — Схема обработки образов

Значения из А. 1.2.2 используют для вычисления выходных значений переменных психоакустической модели (см. таблицу А.1 и рисунок А.3).

Рассчитывают значения 11 переменных психоакустической модели. Наименование и краткое описание переменных психоакустической модели приведены в таблице А.1.

Т а б л и ц а А.1 — Выходные переменные психоакустической модели

Наименования выходной переменной модели

Описание

Bandwidth RefB

Ширина полосы исходного аудиосигнала

BendwidthTestB

Ширина полосы восстановленного аудиосигнала

Total NMRB

Отношение уровня шума к порогу маскирования

WmModOIfne

Оконная разница модуляций

AOBB

Среднее поблочное искажение

EHSB

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

AvgModDIfflB

Средняя разница модуляции 1

AvgModDlff2B

Средняя разнице модуляции 2

RmsNoieeLoudB

Громкость шума

MFPOB

Максимальная вероятность обнаружения искажения

ReiDietframeeB

Относительное искажение фреймов

^PRI* Л1    П)    tyof/?(nl

л] А#И*. л]    ЛГ^Г|П]

Рисунок А.З — Схеме вычисления значений выходных переменных психоакустической модели


Для деухкаиальных аудиосигналов значения переменных для каждого канала следует рассчитывать отдельно. а затем усреднять. Значения всех переменных (кроме значений переменных АОВв и MFPD8) для каждого канала сигнала рассчитывают независимо от второго канала.

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

Значения, которые будут усреднены, должны лежать в границах, определяемых следующим условием: начало или конец да иных, которые будут подвержены усреднению, определяют как первую позицию сначала или скопца последовательности значений амплитуд аудиосигнала, для которой сумма пяти последовательных абсолютных значений амплитуд превышает 200 е любом из аудио каналов. Фреймы, которые лежат вне этих границ, следует игнорировать при усреднении. Значение порога 200 используют в случае, если амплитуды входных аудиосигналов нормализованы е диапазоне от минус 32768 до плюс 32767. 8 противном случае значение порога Ат вычисляют следующим образом.

А* ■ 200


32768'


(А.64)


где Атак — максимальное значение амплитуды аудиосигнала.

В дальнейшем индекс фрейма /> начинается с нуля для первого фрейма, удовлетворяющего условиям проверки границ с порогом Ат. и отсчитывает число фреймов N вплоть до последнего фрейма, удовлетворяющего вышеприведенному условию.

А.1.2.3.2 Оконная разница модуляций 1 (WlnModOiff18)

Вычисляют мгновенную разницу модуляций,    л), по формуле

(А.65)


л)


1+МА\к.п\

Значение мгновенной разницы модуляций усредняют по всем полосам частот Ыс а соответствии со следующей формулой

(А.66)


-    100 V

14 <    к-0

Конечное значение выходной переменной получают усреднением формулы (А.бб)соскользящим окном L ■ 4 {85 мс. так как каждый шаг равен 1024 оцифрованных значений):

1*


(А.67)

При этом применяют усреднение с задержкой — первые 0.5 с сигнала не участвуют а вычислениях. Количество пропускаемых фреймов составляет:

Ч* “ Г05Г.Д    (А.68)

В формуле (А.68) операция f ] означает отбрасывание дробной части.

В формуле (А.67) индекс фреймов включает только фреймы, которые идут после задержки величиной 0.5 с. А.1.2.3.3 Средняя разница модуляций 1 (WinModOiffiB)

Значение данной выходной переменной психоакустической модели.    . вычисляют по формуле

н I

(А.69)

где

• О


(А.70)

Для вычисления этого значения также применяют усреднение с задержкой. А.1.2.3.4 Средняя разница модуляций 2 (WinModDiff2B)

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

ЛМ*.л)~ М«(к.л)

л)


001- |


(А.71)


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

100


(А.72)

Конечное значение переменной психоакустической модели МллН2л вычисляют по формулам (А.73) и (А.74)

М-1


М


440124


(А.73)


где

(А.74)


Е„\к.п\

Гс ел(*.л|*юо(£^)Г л

При вычислении этого значения также применяют усреднение с задержкой.

А.1.2.3.5 Громкость шума (RmsNoieeLoudB)

Значение мгновенной громкости шума рассчитывают по формуле

Л. 1

(А.75> (А.76)

(А.77) (А.78)

(А.78)


(А.80)


w,H«(2«w I !*• "Ь

Л, /* „1. (_£Л*1_Г”[(, Ч ■"««<*, |».л|£„ 1».П)- а<[*.п|£,|>|*.г>).0)|0 3

1 U, |fc./»je0j [I £|*| + p(ft.Afcl|fc.0)£m,|*.n| J

гд* £0 • 1.

л] - Г0МД*. л] . S0;

S,(*. "] ■ T0U,lk. п] ♦ S0;

|1 [ft. л) ■ а«р f-u

I    £и,(*.л)    )

где а ■ 1.5;

Г0-0.15: s0 - O.S.

Если мгновенная громкость моно* О. •• устанааливают равной 0:

дл).!^'л> ^'л'г0'

10    <Va|n)<0.

Значение конечной выходной переменной психоакустической модели ^L,mse находят усреднением мгновенной громкости по формуле (А.81):


Для вычисления этого значения применяют усреднение с задержкой. Совместно с усреднением с задержкой используют порог громкости для нахождения значения мгновенной громкости шума, начиная с которого выполняют промесс усреднения. Таким образом, усреднение начинают с первого значения, определяемого условием превышения порога громкости, но не позднее 0.5 с от начала сигнала (в соответствии с усреднением с задержкой).

Условие превышения порога громкости

Значения мгновенной громкости шума а начале обоих сигналов (исходного и восстановленного) игнорируют до тех пор. пока не пройдет 30 мс после того, как значение обшей громкости превысит а обоих каналах одного из сигналов значение порога, равное 0.1.

Условие превышения порога имеет вид:

(А.82)


яля моносигнала стереосигнала.

гдеЦ ■ 0.1.

Количество пропускаемых после превышения порога фреймов Notf рассчитывают по формуле (А.83)

<А*83>

А.1.2.3.6 Ширина полос исходного и восстановленного аудиосигналов (BandwIdthRefB и Bandwidth Те slB)

Операции вычислений ширины полос исходного и восстановленного аудиосигналов описывают а терминах операций на выходных значениях ДПФ. выраженных а децибелах. Прежде всего для каждого фрейма выполняют следующие операции:

•    для восстановленного сигнала: находят самую большую компоненту после частоты 21600 Гц. Это значение называют уровнем порога:

•    для исходного сигнала: выполняя поиск вниз, начиная с частоты 21600 Гц. находят первое значение, которое превышает значение уровня порога на 10 дБ. Соответствуюшую этому значению частоту называют шириной полосы для исходного сигнала:

- для восстановленного сигнала: выполняя поиск вниз, начиная со значения ширины полосы и сходного сигнала. находят первое значение, которое превышает значение уровня порога на 5 дБ. Обозначают соответствуюшую этому значению частоту как ширину полосы для восстановленного сигнала.

Если найденные частоты для исходного сигнала не превышают 8100 Гц. то ширину полосы для этого фрейме игнорируют.

Значений ширин полос для асех фреймов называют основными частотами ДПФ.

Основную частоту ДПФ для л-го фрейма обозначают как К^|л]для исходного сигнала и как КДл)— для восстановленного сигнала. Вычисление конечных значений переменных психоакустической модели, значений ширин полос исходного и восстановленного сигналов необходимо выполнять по следующим формулам соответственно:

(А84)

N „.в

(A.8S)


и'.,7г1МпЬ

/V „ о

где суммирование осуществляют только для тех фреймов, в которых основная частота ДПФ превышает 8100 Гц. А.1.2.3.7 Отношение уровня шума к порогу маскирования (TolalNMRB)

Порог маскирования М[к. л) вычисляют по формуле (А.86)

М\к. л)


В^[к,п\


•    I*.


(А.86)


где

(А.87)


(А.88)


(А.89)


(А.90)


(3.    к £ 12/Д2,

meolftl * |о^5ЛД2. Ас > 12/Д2.

Уровень шума.    (Ас), вычисляют по формуле (А.88)

** l*„,l- 2    WI1.

где к — индекс основной частоты ДПФ

Отношение уровня шума к порогу маскирования в Ar-й полосе частот выражают формулой (А.89)

л    £ач(Аг,л|

MlAt.nl р,Л* £.*(*."]

Конечное отношение уровня шума к порогу маскирования RNU(ot дБ. вычисляют по формуле (А.90)

( , »■» 1 •

* <0 "»вм> тт IТГ Ё *«* !* я» •

п оМс ш,0    .

А.1.2.3.8 Относительное искажение фреймов (ReiDlstFramesB)

Максимальное отношение шума к порогу маскирования фрейма ^М(Т)адИ1 вычисляют по формуле (А.91):

* ma«(R„v|*.n|).    (А.91)

Оч*^. I

Искаженным считают тот фрейм, а котором максимальное отношение шума к порогу маскирования более 1.5д6.

Конечное значение выходной переменной психоакустической модели представляет собой отношение количества искаженных фреймов к общему количеству фреймов

А.1.2.3.9 Максимальная вероятность обнаружения искажения (MFPOB)

Сначала вычисляют асимметричное возбуждение:

’ £г«в(*.л|. £^|Ас.л)^£., (Ar.nl,

(А.92)

6д»ов1*«л)а 101од(£,л(Ас.л)), где — »

E*iat[k.n\* 10log,o(B*i (Ас.п|).

(А.93)

Далее вычисляют шаг для обнаружения искажения, s |Ас. л), по формуле

$(Ас. л] -

.|с«♦ еЛК./>1*с,!1!*./))-»c,L*(<r.n|*| . nJ>0

(А.94)

|l-lOM.J.(A.ft)sO.

где с0 ■-0.198719;

с, * 0.05S0197: с2 • -0.00102438:

(А.95)

с3- 5.03622 Ю"6:

с4 « 9.01033 10*и: Cft ■ 5.95072.

а3 • 6.39468:

г ■ 1.71332;

Вероятность обнаружения вычисляют по формуле

I "Ь*1г**1> *0 PJ*. п|»1-(05)^    ^

где показатель степени 6 вычисляют по формуле

<А.9б)


(А.97)


Затем вычисляют количество шагов сверх порога вероятности обнаружения. pj*. п\. по формуле

<М*. />)


|Г«ыые1*-л1-^ив1»«лГ||

slAf.n|


(А.98)


Характеристики по формулам (А.96) и (А.98) вычисляют для каждого канала сигнала. Для каждой частоты и времени полную вероятность обнаружения и полное число шагов сверх порога выбирают как большее значение из всех каналов:

(А.99) (А. 100)


* 1 - П (1 - та* (р,[*. «). pj*. л)».

• U

QJ<4* £тах(р,(*.    л|).

А-0

где индексы 1 и 2 — номера каналов.

Для одноканальных сигналов характеристики вычисляют по формулам (А.101) и (А. 102):

и. 1

pj»|4- По-рД*.п]|.    <А-101>

А >0 *< 1

Оа(л| • £<?,(*■ «]    (А.102)

А 'О

Выполняют следующие вычисления:

PJ«I * c/6I" -«)♦<«- Co)pJ"l.    (А.103)

где са » 0.9 и начальное уелоеие — нулееое.

Максимальную вероятность обнаружения искажения Рм(л) вычисляют по рекуррентной формуле

PJn) • тax(Pw(n - 1). Рь|л|).    (А.104}

Конечное значение выходной переменной психоакустической модели MFPDB рассчитывают по формуле (A.10S)

(A.10S)


(А.106)


MPPOe«PJA/-1).

А.1.2.3.10 Среднее поблочное искажение (АОВВ)

Сначала вычисляют сумму общего числа шагов сверх порога обнаружения О, по формуле

о.* 1о.и

е О

Причем суммирование ведут для всех значений, для которых PJ/>) > 0.5. Конечная характеристика АОВв имеет вид:

[0.


АОВ0ш


N «0.

N > 0. О. > 0. N > 0. О. * 0.


(А.107)


А.1.2.3.11 Гармоническая структура ошибки (EHS8)

выходы ДПФ для исходного и восстановленного сигналов обозначают как Хл|Л] и Хт |*| соответственно.

Вычисляют характеристику 0(A):

(A. 108)


(А.109)


Of*) • log ||И'|к)Хг|*)|>)- log    • log]    • 0 i К i Nfl2.

Формируют аектор длины M из значений 0(Я):

0,*<0|1|.....0(|* М-1])'.

..    .    *** *000/*- fj-l _ __

где К4 ■    * 2 J    * 1    » 256.

Нормализованную автокорреляцию вычисляют по формуле (А.110)

сип


од.,

т/ю.по,./


(А.110)


где (е[0; l-mJJ

При С(/| * С (/. 0) необходимо вычислить:

|0о.||0/.    /.0.

l|0( /*0(/* A# - 1|*    - 1J2 lit it,

При вычислении по формуле (А. 110) а случае, если сигналы равны, необходимо установить нормализованную автокорреляцию равной единице, чтобы избежать деления на ноль.

Вводят оконную функцию:

Н|/)«


05 JSfl* 1 - сое

I

0. в

О </<L.


(А.112)


в остальных случаях.


К нормализованной автокорреляции применяют оконное преобразование по формуле (А.113)

СЛт\я Н[т)[С[т* 1)-С). О *m    1.    (А.113)


_ 1 l,4>

гдеС »--£C|/|.

«-•■ «и

Спектр мощности S(Ar) вычисляют no формуле (А.115)


(А.114)


S{k)

Г1М -T

/•о


(А.115)


Поиск максимального пика спектра мощности начинаются ■ 1 и заканчивают при£(Я]> S|A - 1)илиЯ > i.maii/2. Найденное значение максимального лике обозначают как £«maR(n] Тогда конечное значение выходной переменной лсихоакустической модели рассчитывают по формуле (А.116)


.(1000/W)

• -О


(А.116)


При вычислении этого значения исключают фреймы с низкой энергией. Для определения фреймов с низкой энергией вводят пороговое значение

АЦ, « 8000(4^/32768)*.    (А.117)


гдеАт01 «32768 для амплитуд, хранимых а виде 16 битного целого числа.

Энергию фрейме А2 оценивают по формуле (А.118):

Hr 1

I*1!»)

При вычислении гармонической структуры ошибки фрейм игнорируют, если: {А$ <4*г)А(4* <А^).    для моносигнала.

<■*?. < Ли)л<А5, « А!,)л(А,% <К') Л<А5, " <.)•    ЯП»стереосигнала.


(А.118)


(А.119)


А1.2.4 Нормирование значений выходных переменных психоакустической модепи

Нормирование подученных на предыдущем шаге значений выходных переменных психоекустической моде-пи выполняют по формуле (А.120)

AOI


ЧН-^1


(А.120)


гдем, (J)— значение (-й выходной переменной психоекустической модели, а значение и emaJi) приведены а таблице А.2.

Таблице А.2 — Константы для нормирование значений выходных переменных психоакустической модели

Индекс переменой, i

Наименование переменной

Минимальное

мачете

Максимальное значение a Irl

нем1 1

0

BandwidthRefB

393.916656

921.0

1

BandwidthTestfi

381.965332

881.131226

2

TotaINMRB

-24.045116

16.212030

3

WinModDIffIB

1.110661

107.137772

4

AOBB

-0.206623

2.886017

5

EHSB

0.074318

13.9333S1

6

AvgModDiff18

1.113683

63.257874

7

AvgModDiff28

0.950345

1145,018555

8

RmsNoiseLoudB

0.029985

14.819740

9

MFPDB

0.000101

1.0

10

RelDistFrames8

0.0

1.0

A.1.2.S Оценка качества восстановленного сигнала с помощью искусственной нейронной сети Не вход нейронной сети подают значение 11 выходных переменных психоекустической модели, рассчитанных в А. 1.2.1— А. 1.2.4. Нейронная сеть имеет 11 нейронов во входном слое, один скрытый слой с тремя нейронами и один нейрон в выходном слое. Выход нейронной сети — конечное значение метрики РЕАО рассчитывают по формуле (А.121)

(А.121) (А.122)


(А.123)


P6AQ •    * <£>„.. « 6mn|s<9 (О,).

где Ь    * -3.08 и Ь ■ 0.22. в функция sig (я) — асимметричнее сигмоида

а<9 (*)

Значение О, вычисляют следующим образом:

м

и'.лл* £«и

где М[ |j'J— нормализованное значение т-й выходной переменной. /— количество выходных переменных (равное 11). J— количество нейронов в скрытом слое (равное трем),    и^0 — значения

весов и смешений нейронной сети, приведенные а таблицах А.Э—А.5.

Таблица А.З — Веса нейронной сети

Индекс i

Вес wjii. 0)

Вес wл |/. 1)

вес |/. 2)

0

-0.502657

0.436333

1.219602

1

4.307481

3.246017

1,123743

2

4.984241

2.211189

-0.192096

3

0.0511056

-1.762424

4.331315

4

2.321580

1.789971

-0.754580

5

-5.303901

-3.452257

-10.814982

Окончание таблицы А.З

Индекс 1

Вес wji. 0)

Вес *,(». 1)

Вес *,(1. 2)

6

2.730991

-6.111805

1.519223

7

0.624950

-1.331523

-5.955151

8

3.10288

0.871260

-S .9228 78

0

-1.051468

-0.939882

-0.142913

10

-1.804679

-0.503610

0.620456


Таблица А.4 — Смещения нейронной сети

Bias w ^

Bus *(0)

В**

Bia* ", J2I

-0.307594

-2.518254

0.654841

-2.207228


Таблица A.S — Веса и смещения нейронной сети

Индекс/

Вес *,[/!

0

-3.817048

1

4.017138

2

4.629582


Это значение метрики (РЕАО) представляет собой вещественное число, принадлежащее отрезку [-3.08;

0,22).

А.2 Алгоритм расчета метрики PSNR

Пиковое отношение сигиал/шум между исходным аудиосигналом XR и восстановленным ХТ рассчитывают по формулам:

PSNR • 1019 та*Х”.    <А.124)

S ■


(A.12S)

где разности значений сигналов О, и их математическое ожидание d рассчитывают по формулам:

(А.126)


0,ЯХ*. -X,.- “‘IrZo-

Л , |

гдеХл и Хг — r-е оцифрованные значения исходного и восстановленного аудиосигналов соответственно, г» 1.

’    *    2......л;

max XR — максимальное значение среди оцифрованных значений исходного аудиосигнала.

А.З Алгоритм расчета метрики «коэффициент различия форм сигналов*

Пусть Хр— исходный моиоканальиый аудиосигнал (либо один канал исходного многоканального аудиосигнала). в Хг — восстановленный моиокаиальный аудиосигнал (л ибо один канал восстановленного многоканального аудиосигнала). Оба сигнала состоят из одинакового количества значений N.

Массивы значений амплитуд сигналов XR и Хт представляют в виде относительного изменения значений амплитуд сигнала:

(А.127) (А.128)

Значение метрики «коэффициент различий форм сигналов» К вычисляют как сред не квадратическое отклонение массивов значений амплитуд 6XR и dXT

м

(А.129)


-ах,)'

К


I I__

N

А.4 Алгоритм расчета коэффициента сжатия

Пусть £0 — объем памяти, который занимают исходные аудиоданные, а $с — объем памяти, который занимают сжатые данные, тогда коэффицеит сжатия к рассчитывают по формуле


(А.130)

Приложение Б (рекомендуемое)

Листинги программ расчета метрик качества аудиоданных

Б.1 Листинг программы расчета метрики PEAQ на языке Matlab

function ODG s PQevaiAudto (Fret. Rest. Starts. EndS)

% Оценка качества аудиоданных с точки зрения восприятия (Perceptual evaluation of audio quafcty)

% - Starts - индекс значения, соответствующего началу сигнала.

% - EndS - индекс значения, соответствующего концу сигнала.

% глобальные переменные global MOVC PQopt

% параметры NF = 2048:

Nadv = NF / 2:

Version = 'Basic':

% настройки POoptClipMOV = 0:

POopLPCinit = 0;

POopLPDfactor = 1:

PQopt.Ni = 1;

POopt.DelayOverlap = 1;

POoplDataBounds = 1:

PQoplEndMtn = NF / 2:

addpath ('C8\ 'MOV. *Misc\ 'Patt');

if (nargin < 3)

Starts = (0. 0]; end

if (nargin < 4)

EndS = (]: end

% вычислить количество значений и каналов для каждого входного файла WAV(t) = POwavFilePar (Fref):

WAV(2) = PQvvavFilePar (Rest):

% согласовать размеры файлов PO_CheckWAV (WAV): if (WAV(l).Nframe -= WAV(2).N frame) disp f>>> Number of samples differ: using the minimum’): end

% границы данных Nchan = WAV(1).Nchan:

[Starts. Fstart, Fend] = PQ_Bounds (WAV. Nchan. Starts. EndS. POopt):

% фреймов PEAO Np = Fend - Fstart ♦ 1: if (POoptNi < 0)

PQopt.Ni = ceil (Np / abs(POoptNi)): end

% инициализация структуры MOV MOVC = POJnitMOVC (Nchan. Np):

Nc = PQCB (Version): for (j = 0: Nchan-1)

Fmem(j+1) = PQinitFMem (Nc. PQopt.PCmit): end

is = 0:

for (i = -FslartNp-1)

% считать фрейм данных

xR s POgetData (WAV(1). StarlS(l) ♦ is. NF); % Reference foe xT = PQgetOata (WAV(2). StartS(2) ♦ is. NF):    % Test file

is = is ♦ Nadv;

% обработка фрейма for (j = 0:Nchan-1)

|MOVt(j*1). Fmem(j*1)l = POeval (xR(j«-1,:), xT(j*1.:). Fmem(j*1)); end

rf <i >= 0)

% вывести MOV в новую структуру

PQframeMOV (i. MOVI); % выходные значения теперь в глобальной переменной MOVC % вывод значений

if (POopt.Nt -= 0 & mod (i. PQopt.Ni) == 0)

%    POpctMOVa (Nchan, i. MOVC):

end end end

% усреднение no времени значений MOV if (POopt.DeiayOverlap)

Nwup = F start; else

Nwup =0: end

MOVB = PQavgMOVB (MOVC. Nchan. Nwup):

% запуск нейронной сети OOG = POnNet (MOVB);

% совокупный вывод значений % POprtMOV (MOVB. ODG):

%-

function PQ_Chec*WAV (WAV)

% проверка файлов

Fs = 48000:

if (WAV(1). Nchan -= WAV(2).Nchan) enror (•»> Number of channels differ'); end

if (WAV(l).Nchan > 2) error (*»> Too many input channels’); end

if (WAV(l).Nframe -= WAV(2).Nframe) disp ('»> Number of samples differ*); end

if (WAV(1).Fs -= WAV(2).Fs) error f»> Sampling frequencies differ*): end

if (WAV(1).Fs “= Fs)

error (*>» Invalid Sampling frequency: only 48 kHz supported’): end

%-

function (Starts. Fstart Fend) = PQ_Bounds (WAV. Nchan. StarlS. EndS. PQopt)

PQ NF = 2048:

PO_NADV = (PO_NF / 2);

if (isempty (Starts))

StartS(1) = 0;

StartS<2) = 0;

elseif (length (StarlS) == 1)

StartS<2) = StartS(t); end

Ns = WAV(1).N frame:

% границы данных if (POopt.DataBounds)

Lim = PQdataBoundary (WAV(1). Nchan, StartS(1). Ns); fprintf ( PEAQ Data Boundaries: %W (%.3f s) - %ld (%.3f s)\n\... Lim<1), Um(iyWAV(1).Fs. Lim(2). Lim(2)/WAV(1).Fs);

else

Lim = (Starts{1). StarlS(1)+ Ns -1); end

% номер первого фрейма

Fstart = floor ((Lim(1) - StartS(l)) t PO_NADV);

% номер последнего фрейма

Fend = floor ((Lim(2) - StartS( 1) ♦ 1 - POopt.EndMin) f PO_NADV): %.---

function MOVC = POJrvtMOVC ( Nchan. Np)

MOVC.MDifT.Mt1B = zeros (Nchan. Np);

MOVC.MDifT.Mt2B s zeros (Nchan, Np);

MOVC.MDrff.Wl = zeros (Nchan. Np):

MOVC.NLoud.NL = zeros (Nchan. Np);

MOVC.Loud.NRef = zeros (Nchan. Np);

MOVC.Loud.NTest = zeros (Nchan. Np):

MOVC.BW.BWRef = zeros (Nchan. Np):

MOVC.BW.BWTest = zeros (Nchan. Np):

MOVC.NMR.NMRavg = zeros (Nchan. Np);

MOVC.NMR.NMRmax = zeros (Nchan. Np);

MOVC.PD.Pc = zeros (1. Np):

MOVC.PD.Oc = zeros (1. Np);

MOVC.EHS.EHS = zeros (Nchan. Np);

function ODG = POnNetB (MOV)

% нейронная сеть для получения конечного значения метрики

persistent amin amax wx wxb wy wyb brnin bmax I J CLIPMOV global POopt

if (isempty (amin))

I = length (MOV): if (I -It)

(amin. amax. wx. wxb. wy. wyb. bmm. bmax] = NNetFar (’Basic’); else

(amin. amax. wx, wxb. wy. wyb. bmin, bmax] = NNetFar ('Advanced’); end

(I. J] = size (wx): end

sigmoid = inline ('1/(1 ♦ exp(-x))');

% Scale the MOV's Ndip = 0;

MOVx = zeros (1,1): for (i = 0:1-1)

MOVx(i+1) = (MOV(i+1) - amin(i*1)) / (amax(i*1) - amm(r*1)); if (- isempty (POopt) & PQopt.ClipMOV -= 0) if (MOVx(i+1)<0)

MOVx(i*1) = 0;

Ndip = Ndip ♦ 1: elseif (MOVx(i+1) > 1)

MOVx(i*1) = 1;

Ndip = Nd<) ♦ 1; end end end

if (Ndip > 0)

fprinlf (’>» %d MOVs dipped\n‘. Nclip): end

% нейронная сеть Dl = wyb: for (j = 0:J-1) arg = wxb(j+1); for (i = 0:1-1)

arg = arg ♦ wx(i+ 1    1)4 MOVx(i+ 1);

end

Dl = Dl ♦ wy(j*1) * sigmoid (arg); end

OOG = bmin ♦ (bmax - bmin)4 sigmoid (Dl);

function (amin. amax, wx. wxb. wy. wyb. bmin. bmax] = NNetPar (Version)

rf (strcmp (Version. 'Basic')) amin =...

(393.916656. 361.965332. -24.045116.    1.110661. -0.206623....

0.074318,    1.113683. 0.950345. 0.029985. 0.000101....

0]:

amax = ...

(921.    881.131226, 16.212030. 107.137772. 2.886017,...

13.933351, 63.257874. 1145.018555. 14.819740, 1.    ...

i];

wx = ...

I (-0.502657. 0.436333. 1.219602];

( 4.307481.3.246017. 1.123743];

( 4.984241. -2.211189. -0.192096];

( 0.051056.-1.762424. 4.331315];

( 2.321580, 1.789971, -0.754560];

(-5.303901. -3.452257. -10.814982 ];

I 2.730991,-6.111805. 1.519223];

( 0.624950.-1.331523. -5.955151 ];

( 3.102889. 0.871260. -5.922878];

(-1.051468.-0.939882. -0.142913];

( -1.804679, -0.503610. -0.620456 ] ]; wxb =...

(-2.518254, 0.654841. -2.207228 ]; wy= ...

(-3.817048. 4.107138. 4.629582]; wyb = -0.307594; bmin = -3.98; bmax = 0.22: else

am»n =...

( 13.298751. 0.041073. -25.018791. 0.061560. 0.024523]; amax = ...

(2166.5.    13.24326,    13.46708. 10.226771. 14.224874];

wx =...

(( 21.211773.-39.913052.-1.382553, -14.545348. -0.320899]:

( -8.981803. 19.956049. 0.935389. -1.686586. -3.238586];

( 1.633830. -2.877505.-7.442935. 5.606502, -1.783120];

( 6.103821. 19.587435.-0.240284, 1.088213. -0.511314];

( 11.556344. 3.892028. 9.720441. -3.287205.-11.031250]]; wxb =...

( 1.330890. 2.686103. 2.096598.-1.327851. 3.087055]: wy = ...

[ -4.696996. -3.289959. 7.004782.6.651897, 4.009144]; wyb = -1.360308; bmm = -3.98; bmax = 0.22: end

function (Nc. fc. fl. fu. dz) = РОС В (Version)

% параметры критической полосы пропускания

В = inline (7 ' asinh (f / 650)’);

Bl = inline (*650 * sinh (z / 7)’);

a. = 80;

fU = 18000;

if (strc/np (Version. ’Basic’)) dz = 1/4;

eisetf (strcrnp (Version. ‘Advanced*)) dz = 1/2; else

error ('PQCB; Invalid version'); end

zL = B(fL); zU = B(fU);

Nc = ceil((zU-zL)/dz); zl = zt ♦ (0;Nc-1) * dz; zu = min (zL ♦ (t:Nc) * dz. zU); zc = 0.5 * (zl ♦ zu);

П = Bl (zl); fc = Bl (zc); fu = Bl (zu);

if (strong (Version. ’Basic’))

Л = ( 80.000.

103.445,

127.023,

150.762.

174.694....

198.849.

223.257.

247.950.

272.959.

298.317,...

324.055.

350.207.

376.805.

403.884.

431.478....

459.622.

488.353.

517.707.

547.721.

578.434,...

609.885.

642.114,

675.161.

709.071.

743.884,...

779.647.

816.404.

854.203.

893.091.

933.119, ...

974.336.

1016.797.

1060.555.

1105.666.

1152.187....

1200.178.

1249.700.

1300.816.

1353.592.

1408.094....

1464.392.

1522.559.

1582.668.

1644.795.

1709.021,...

1775.427.

1844.098.

1915.121.

1988.587.

2064.590....

2143.227.

2224.597.

2308.806.

2395.959.

2486.169....

2579.551.

2676.223.

2776.309.

2879.937.

2987.238....

3098.350.

3213.415.

3332.579.

3455.993.

3583.817....

3716.212,

3853.817.

3995.399.

4142.547.

4294.979....

4452.890.

4616.482.

4785.962.

4961.548.

5143.463,...

5331.939.

5527.217.

5729.545.

5939.183.

6156.396....

6381.463.

6614.671.

6856.316.

7106.708.

7366.166....

7635.020.

7913.614.

8202.302.

8501.454.

8811.450. ...

9132.688.

9465.574.

9810.536. 10168.013. 10538.460....

10922.351.

11320.175.

11732.438. 12159.670.12602.412....

13061.229.

13536.710. 14029.458. 14540.103. 15069.295,...

15617.710.

16186.049. 16775.035. 17385.4201;

fc = [ 91.708.

115.216.

138.870.

162.702.

186.742,...

211.019,

235.566.

260.413,

285.593.

311.136....

337.077.

363.448.

390.282.

417.614.

445.479....

473.912.

502.950.

532.629.

562.988.

594.065....

625.899.

658.533.

692.006.

726.362,

761.644,...

797.898.

835.170.

873.508.

912.959.

953.576,...

995.408.

1038.511.

1082.938.

1128.746.

1175.995....

1224.744.

1275.055.

1326.992.

1380.623.

1436.014,...

1493.237.

1552.366.

1613.474.

1676.641.

1741.946....

1809.474.

1879.310.

1951.543.

2026.266.

2103.573....

2183.564.

2266.340.

2352.008.

2440.675.

2532.456,...

2627.468.

2725.832.

2827.672.

2933.120.

3042.309....

3155.379.

3272.475.

3393.745.

3519.344.

3649.432....

3784.176.

3923.748.

4068.324.

4218.090.

4373.237,...

4533.963.

4700.473.

4872.978.

5051.700.

5236.866....

5428.712.

5627.484.

5833.434.

6046.825.

6267.931,...

6497.031.

6734.420.

6980.399,

7235.284.

7499.397,...

7773.077.

8056.673.

8350.547.

8655.072,

8970.639,...

9297.648.

9636.520.

9987.683.

10351.586,10728.695....

11119.490. 11524.470, 11944.149. 12379.066. 12829.775.... 13294.850. 13780.887, 14282.503, 14802.338, 15341.057.... 15899.345. 16477.914, 17077.504, 17690.045 J;


fu = l 103.445,    127.023,

223.257,    247.950,

350.207,    376.805,

488.353,    517.707,

642.114.    675.161,

816.404,    854.203,

1016.797. 1060.555, 1249.700, 1300.816, 1522.559, 1582.668,


1844.098,

2224.597,

2676.223,

3213.415,

3653.348,

4643.482,

5527.217,

6614.671.

7913.614,


1915.121, 1988.587, 2308.806, 2395.959. 2776.309, 2879.937, 3332.579, 3455.993, 3995.399, 4142.547. 4785.962, 4961.548, 5729.545, 5939.183, 6856.316, 7106.708, 8202.302, 8501.454,


150.762,    174.694,    198.849....

272.959,    298.317.    324.055...

403.884,    431.478.    459.622....

547.721,    578.434,    609.885...

709.071,    743.884 .    779.647....

893.091,    933.113,    974.336....

1105.666, 1152.187, 1200.178,... 1353.592. 1408.094, 1464.392.... 1644.795. 1709.021, 1775.427....


2064.590, 2143.227... 2486.169, 2579.551... 2987.238, 3098.350... 3583.817. 3716.212... 4294.979. 4452.890... 5143.463. 5331.939... 6156.396. 6381.463... 7366.166, 7635.020... 8811.450, 9132.688....


end


9465.574. 9810.536, 10168.013, 10538.460. 10922.351.... 11320.175.11732.438, 12159.670. 12602.412, 13061.229,... 13536.710, 14029.458, 14540.103, 15069.295. 15617.710.... 16186.049, 16775.035, 17385.420, 18000.000 J;


function Es = PQspreadCB (E. Ver)

% распространение возбуждений % E и Es - энергии

persistent Bs Version

if <- strcmp (Ver, Version))

Version = Ver,

Nc = length (E);

Bs = PQ_SpreadCB (ones(1 ,Nc), ones(I.Nc), Version); end

Es = PQ_SpreadCB (E. Bs. Version):

%-----

function Es = PQ_SpreadCB (E. Bs. Ver);

persistent Nc dz fc aL aUC Version

e = 0.4;

if (- strcmp (Ver, Version))

Version = Ver.

[Nc. fc. ft. fu. dz] = PQCB (Version); end

% выделение памяти aUCEe = zeros (1. Nc):

Ene = zeros (1. Nc);

Es = zeros (1, Nc):

% вычисление термов, зависящих от энергии aL = 10А(-2.7 • dz): for (m = 0:Nc-1)

aUC = 10A((-2.4 - 23 / fc(m+1)) • dz); aUCE = aUC * E(m*1)A(0.2 * dz); gIL = (1 - aLA(m*1))/(1 - aL); glU = (1 - aUCEA(Nc-m)) / (1 - aUCE);

En = E(m+1)/ (gIL ♦ glU - 1); aUCEe(m+1) = aUCEAe;

Ene(m+1) = EnAe: end

% распространение вниз Es(NoHI) = Ene(Nc-1*1); aLe = aL^; for (m = Nc-2:-1:0)

Es(mM) = aLe * Es(m+1*1) ♦ Ene(m+1): end

% распространение вверх i > m for (m = 0:Nc-2) r = Ene(m^1): a = aUCEe(m+1); for (i = m*1:Nc~1) r = r*a:

Es(i*1) = Es(i+1) ♦ r, end end

for(i = 0:Nc-1)

Es(i+1) = (Es(i+1))A(1/e)/ Bs<i*1); end

function Eb = PQgroupCB (X2, Ver)

% группировка вектора энергии ДПФ и критической полосы пропускания % Х2 - вектор значений, возведенных в степень 2 % ЕЬ - вектор возбуждений

persistent Nc kl ku Ul Uu Version

Emin = 1e-12;

if (- strcmp (Ver. Version))

Version = Ver:

NF = 2048:

Fs = 48000;

[Nc. kl. ku. Ul. Uu] = PQ_CBMapp«ng (NF. Fs. Version): end

% выделение памяти Eb = zeros (1. Nc):

% выделение возбуждений в каждой полосе for (i = 0:Nc-1)

Ea = UI(MrX2(W(i*1)+1); for (k = (W(r+1 )♦ 1 ):(ku(i+ 1 у t))

Ea = Ea*X2(k+1); end

Ea = Ea ♦ Uu(i*1) * X2(ku(iM)H):

Eb(i*1) = max(Ea, Emin): end

%.---------

function [Nc. kl. ku. Ul. Uu] = PO_C В Mapping (NF. Fs. Version)

[Nc. fc, П. fu] = PQC8 (Version):

df = Fs/NF: for (i = 0:Nc-1) fli = fl(i*1): fui = fu(i+1): for (k = 0:NF/2) rt ((k*0.5)#df > fli) kl(i+1) = k;

Ul(i*1) = (min(fui, (k*0.5)*df)...

- max(fli. (k-0.5)‘df>) / df:

break:

end

end

for (к = NF/2>1:0) if ((k-0.5)#df < fui) ku(i*1) = k: if (kl(i*1)== ku(i*1>)

Uu(i+1) = 0: else

Uu(i*M) = (min(fii, (k*0.5)*df)... -max(fli. (k-0.5)*df))/df: end break: end end end

function (МОVI. Fmem| = PQeval (xR. xT. Fmem)

% PEAO - обработке единичного фрейма

NF = 2048:

Version = Basic';

% оконное ДПФ

X2(1.:) = PQDFTFrame (xR),

X2(2.:) = PQOFTFrame (xT);

[EbN, Es) = PO_excitCB (X2):

(Ehs{1.:), Fmem.TDS.Ef(1.:)) = POJimeSpread (Es(1.:). Fmem.TDS.Ef(1,:)): [Ehs(2.:). Fmem.TDS.Ef(2.:)j = POJimeSpread (Es(2.:). Fmem.TDS.Ef(2,:)):

% адаптация паттернов возбуждения

[EP. F mem .Adар] = POadapt (Ehs. Fmem.Adap, Version. *FFT);

% паттерны модуляции

[M. ERavg. Fmem.Env] = PQmodPatt (Es, Fmem.Env):

% громкость

MOVI.Loud.NRef = POtoud (Eh$<1.:). Version. TFT).

MOV (Loud. N Test = POtoud (Ehs<2.:). Version. TFT):

% разница модуляций

MOVI. MDHf = PQmovModDrffB (M. ERavg):

% громкость шума

MOVJ. NLoud.NL = POmovNLoudB (M. EP);

% полоса пропускания MOV1.BW = POmovBW (X2);

% отношений шума x маскированию MOVI.NMR = POmovNMRB (EbN. Ehs(1.:));

% вероятность обнаружения MOVI.PD = POmovPD (Ehs):

% ошибка гармонической структуры MOVI.EHS.EHS = POmovEHS (xR. xT. X2):

%__

function [EbN. Es] = PO.exdtCB (X2)

persistent W2 EIN

NF = 2048;

Version = Bas*c‘; if (isempty (W2))

Fs = 48000;

f = linspace (0. Fs/2. NF/2+1):

W2 = PQWOME (f);

[Nc. fc] = РОС 8 (Version);

EIN = PQlntfsIoise (fc); end

% выделение памяти XwN2 = zeros (1, NF/2*1);

% фильтрация на основе модели внешнего и среднего уха Xw2(1.:) = W2 .* X2(1.1:NF/2+1);

Xw2(2.:) = W2 .* X2(2.1:NF/2*1); for (k = 0:NF/2)

XwN2(k*1) = (Xw2(1.k+1) - 2 * sqrt (Xw2(1,k+1) * Xw2(2,k*1))... ♦ Xw2(2,k*1)); end

Eb<1.:) = POgroupCB (Xw2(1,:>. Version);

Eb<2.:) = POgroupCB (Xw2(2.:), Version);

EbN = POgroupCB (XwN2. Version);

E(1.:) = Eb(1.:) ♦ EIN;

E(2.:) = Eb<2.:) ♦ EIN;

Es(1.:) = POspreadCB (E(1Version);

Es(2.;) = POspreadCB (Е(2Д Version);

V------

function [Ehs, Ef] = PQjimeSpread (Es. Ef)

persistent Nc a b

if (isempty (Nc))

[Nc. fc) = PQCB ('Basic’);

Fs = 48000;

NF = 2048;

Nadv = NF / 2:

Fss = Fs / Nadv;

1100= 0.030: tmtn = 0.008;

[a. b] = POtConst (tIOO. tmin. fc. Fss); end

Ehs = zeros (1. Nc); for (m = 0:No1)

Ef(m+1) = a(m+1) * Ef(m*1) ♦ b(m*1) * Es(m*1);

Ehs(m+1) = max(Ef(m+1). Es{m+1)): end

function X2 = PQDFTFrame (x)

persistent hvv

NF = 2048:

if (isempty (hw))

Amax = 32768; fc = 1019.5;

Fs = 48000;

Lp = 92;

GL = PQ GL (NF. Amax. fc/Fs. Lp); hw = GL' POHarvnWin (NF): end

xw = hw.“ x;

X = PORFFT (xw. NF. 1);

X2 = PORFFTMSq (X. NF);

%.--------

function GL = PO_GL (NF. Amax. fcN. Lp)

W = NF - 1;

gp = POjgp (fcN. NF. W);

GL = 10*(Lp i 20) / (gp ' Amax/4 • W):

%-

function gp = PO_gp (fcN. NF. W)

df = 1/NF; к = floor (fcN I df);

dfN = min ((k+1) • df - fcN. fcN - к * df); dfW = dfN * W;

gp = sin(pi • dfW) i (pi * dfW * (1 - dfWA2)): function Lim = PQdataBoundary (WAV. Nchan. Starts. Ns)

PQL = 5;

Amax = 3276B;

NBUFF = 2048;

PO_ATHR = 200 • (Amax /32768);

Lim{1) = -1; is ^ StarlS;

EndS = Starts ♦ Ns -1; white (is <= EndS)

Nf = min (EndS - is ♦ 1. NBUFF); x = POgetData (WAV. is. Nf). for (k = 0: Nchan-1)

Lim(1) = max (Lim(1). PQ_DataStart (x(k+1Nf. PQ_l. PO_ATHR)); end

ff <Um(1) >= 0)

Lim(1) = Lim(1) ♦ is; break end

is = is ♦ NBUFF - (PQ.L-1); end

Lim(2) = -1; is = Starts; white (is <= EndS)

Nf = min (EndS - is ♦ 1. NBUFF); ie = is ♦ Nf -1;

js = EndS - (ie - Starts ♦ 1) ♦ 1; x = POgetData (WAV. js. Nf). for (k = 0:Nchan-1)

Lim(2) = max (Lim(2). PQ_DataEnd (x(k*1,:). Nf. PO_L. PQ_ATViR)): end

if (Lim(2) >= 0)

Lim(2) = Llm(2) ♦ js; break end

is = is ♦ NBUFF - (PQ.L-1); end

if (“ ((Lim(1) >= 0 & Lim(2) >= 0) | (Lim(1) < 0 & Um(2) < 0))) error f»> PQdataBoundary: limits have difference signs'); end

ifHLim(1)<=Lim(2)))

error f»> PQdataBoundary: Lim(1) > Lim(2)a); end

if (Lim(1) < 0)

Lkn(1) = 0;

Lim (2) = 0; end

%-

function ib = PQ_DataStart (x, N. L. Thr)

ib = -1; s = o;

М = min (N. L); for (i = 0:М-1)

s = s ♦ abs (x(i+1)); end

if (s > Thr) ib = 0; return end

for (i = 1 :N-L)

s = s ♦ (abs (x(i*L-1*1)) - abs (x(i-H1))); if (s > Thr) ib = i; return end end

V---

function ie = PO_DataEnd (x. N. L. Thr)

ie = -1: s = 0.

M = min (N. L); for (i = N-M:N-1) s = s ♦ abs (x(i+1)); end

if (s > Thr) ie = N-1: return end

for (i = N-2:-1:L-1)

s = s ♦ (abs (x(i-L+1*1))- abs (x(i+1 *1))); if (s > Thr) ie = i; return end end

function x = POgetData (WAV. i. N)

persistent Buff

iB = WAV.iB ♦ 1: if (N == 0)

Buff(iB).N = 20 • 1024;    % Fixed size

Buff(iB).x = PO.ReadWAV (WAV. i. Buff(iB).N);

Buff(iB).i = i; end

if (N > Buff(iB).N)

error ('»> PQgetData; Request exceeds buffer size'); end

is = i - Buff(iB).i;

if (is < 01 is ♦ N - 1 > Buff(iB).N - 1)

Buff(iB).x = PQ_ Read WAV (WAV. i. Buff(iB).N):

Buff(iB).i = i; end

Nchan = WAV.Nchan; is = i - Buff(iB).i;

x * Buff(iB).x(1:Nchan.is+1:is+N-1 + 1);

%•--

function x = PO_ReadWAV (WAV. i. N)

Amax = 32768;

Nchan = WAV.Nchan;

х s zeros (Nchan. N);

Nz = 0; if 0<0)

№ = min (-i. N); i = i ♦ Nz: end

Ns = min (N - Nz. WAV.Nframe - i): if (i >= 0 & Ns > 0)

x(1:Nchan.Nz+1:Nz*Ns-1+1) = Amax * (wavread (WAV.Fname. [i*1 i^Ns-1 ♦I J))T; end

function hw = PQHannWin (NF) hw = zeros (1. NF): for (n = 0:NF-1)

hw(n*1) = 0.5 ' (1 - oos(2 * pi' n / (NF-1))); end

function Fmem = POinitFMem (Nc. PCinit)

Fmem.TDS.Ef(1:2.1:Nc) = 0; Fmem.Adap.P(1:2.1:Nc) = 0: Fmem.Adap.Rn(1:Nc) = 0; Fmem.Adap.Rd(1:Nc) = 0;

Fmem.Adap. PC( 1:2.1 :Nc) = PCinit; Fmem.Env.Ese(1:2,1:Nc) = 0: Fmem.Env.DE(1:2.1:Nc) = 0; Fmem.Env.Eavg(1:2.1:Nc) = 0;

function EIN = POIntNoise (0

N = length (0; for (m = 0:N-1)

INdB = 1.456 ' (f(m+1) / 1000)A(-0.8); EIN(m+1) = 10A(INdB f 10):

End function X = PQRFFT (x. N. rfn)

if (rfn > 0)

X = m (X, N):

XR = real(X(0*1:N/2*1));

XI»imag(X(1+1:N/2-1+1)):

X = |XR XI]. else

xR »fx(0+1:N/2+1)]; xl = [0 x(N/2*1*1:N-1*1)0];

x= complex ((xR xR(Nf2-H1 >1:1*1)]. [xl -xl(N/2-1*1 >1:1*1)]); X = real (ifft (x. N)); end

function X2 = PORFFTMSq (X. N)

X2 = zeros (1. N/2*1);

X2(0+1) = X(0*1)A2; for (k= V.N/2-1)

X2(k*1) = X(k*1)A2 * X(N/2*k*1)A2: end

X2(N/2*1) = X(N/2*t)A2;

function [а. b] = PQtConst (1100. tmin, f. Fs) N = length (f): for (m = 0:N-1)

t = tmin ♦ (1001 f(m*1)) • (tlOO - tmin); a(m+1) = exp (-11 (Fs * t)); b(m+1) = (1 -a(m*1)); end

function W2 = PQWOME (f)

N = length (f); for (k = 0:N-1)

fkHz = f(k+1)/1000:

AdB = -2.184 * fkHz4-0.8) ♦ 6.5% exp(-0.6 * (fkHz - 3.3>*2)...

- 0.001 * fkHzA(3.6>:

W2(k*1) = 10A(AdBf 10); end

function WAV = PQwavFilePar (File) persistent iB if (isempty (iB)) iB = 0; else

iB * mod (iB ♦ 1. 2); end

[size WAV.Fs Nbit] = wavread (File, ’size1): WAV.Fname = File;

WAV.Nframe = size(1);

WAV.Nchan = size(2);

WAV.iB = iB;

POgetData (WAV. 0. 0);

function MOV = PQavgMOVB (MOVC. Nchan. Nwup)

Fs = 48000.

NF = 2048:

Nadv = NF / 2:

Fss = Fs I Nadv. tdel = 0.5; tex = 0.050;

|MOV«R1). MOV(HI)) = PO_avgBW (MOVC.BW);

% Total NMRB. RefOislFramesB

[MOV(2^1), MOV(10*1)J = PO_avgNMRB (MOVC.NMR);

% WinModDiflMB. AvgModDiffIB. AvgModDiK2B N500ms = ceil (tdel * Fss);

Ndel = max (0. N500ms - Nwup):

(MOV(3*1). MOV(6*1), MOV(7+1)] = PO_avgModDiflB (Ndel. MOVC.MDiff):

% RmsNoiseLoudB N50ms = ceil (tex * Fss);

Ntoud = PQIoudTest (MO VC. Loud);

Ndel = max (Nloud ♦ N50ms. Ndel):

MOV(8*1) = PO_avgNLoodВ (Ndel, MOVC.NLood);

4ADBB.MFPDB

(MOV(4*1), MOV(9^1)J = PO.avgPD (MOVC.PD);

% EHSB

MOV(5*1) = PO_avgEHS (MOVC.EHS):

%.--------

function EHSB = PQ_avgEHS (EHS)

[Nchan. Np] = size (EHS.EHS); s = 0;

for (j = 0:Nchan-1)

s = s ♦ PQ_LinPosAvg (EHS.EHS(j*1.:)); end

EH SB = 1000 ' s/Nchan;

%--------

function (ADBB. MFPDBJ = PO_avgPD (PD)

global POopt

oO = 0.9;

if (isempty (POopt)) c1 = 1; else

c1 = POopt. PDfactor; end

N = length (PD.Pc);

Phc = 0;

Pcmax = 0;

Qsum = 0: nd = 0; for (t = 0:N-1)

Phc = cO * Phc ♦ (1 - c0) * PD.Pc(i*1);

Pcmax = max (Pcmax * c1. Phc);

if (PD.Pc(i*1)> 0.5) nd = nd ♦ 1 ;

Qsum = Qsum ♦ PD.Qc<i*1); end end

if (nd == 0)

ADBB = 0; elseif (Osum > 0)

ADBB = log 10 (Osum / nd); else

ADBB = -0.5: end

MFPDB = Pcmax;

%----------

function [TotalNMRB. RelDistFramesB] = PQ_avgNMRB (NMR)

[Nchan. Np] = size (NMR.NMRavg):

Thr = 10A(1.5 / 10);

s = 0;

for (j = 0:Nchan-1)

s = s ♦ 10 * log 10 (PQ_LinAvg (NMR.NMRavg(j*1.:))); end

TotalNMRB = s У Nchan: s = 0;

for (j = 0:Nchan-1)

s = s ♦ PQ_FractThr (Thr. NMR.NMRmax(j^1,:)); end

RetDistFramesB = s / Nchan;

%---------

function (BandwidthRefB. BandwidthTestB] = PQ_avgBW (BW)

[Nchan. Np] = size (BW.BWRef);

sR = 0;

$T = 0;

for (j = 0:Ncharv1)

sR = sR ♦ PQ_LinPosAvg (BW.BWRef(rH.:)); sT = sT ♦ PO_LinPosAvg (BW.BWTest(j*1.:j); end

BandwvdthRefB = sR / Nchan;

BandwidthTestB = sT / Nchan:

%.--------

function (WinModDrfMB, AvgModDifTIB, AvgModDiff2B] = PQ.avgModDHVB (Ndel. MOff)

NF = 2048;

Nadv = NF/2:

Fs = 48000;

Fss = Fs t Nadv: tavg = 0.1;

[Nchan, Np] = size (MDrff.MtlB);

L = floor (tavg * Fss); s = 0:

for (j = 0:Ncharv1)

s = s ♦ PO_WinAvg (L. MDiff.Mt1B(j*1,Ndel*1:Np-1*1)); end

WinModDifTTB = s / Nchan; s = 0;

for (j = 0:Ncharv1)

s = s ♦ PQ_WtAvg (MDiff .Ml 1 B(j+ 1 .Ndel* 1 :Np-1 ♦1). MDffi.WT<j*1.Ndet*1:Np-H1)); end

AvgModDifTIB = s / Nchan; s = 0:

for (j = 0:Ncharv1)

s = s ♦ PO_WtAvg (MDiff.Ml2B(j*1,Ndel* 1:Np-1*1), MDrff.Wt(|*1.Ndet*1:Np-1*1)); end

AvgModDiff2B = s / Nchan;

%---------

function RmsNoiseLoudB = PO_avgNLoudB (Ndel. NLoud)

[Nchan, Np] = size (NLoud.NL);

s = 0:

for (j = 0:Ncharv1)

s = s * PO.RMSAvg (NLoud.NL(j*1.Ndel*1:Np-1*1)); end

RmsNoiseLoudB = s / Nchan;

%.---------

function s = PO_LinPosAvg (x)

N = length(x);

Nv = 0: s = 0:

for (i = 0:N-1) if (x(M)>= 0) s = s ♦ x(i*1);

Nv = Nv ♦ 1; end end

if (Nv > 0) s = s f Nv; end

%----

function Fd = PO_FractThr (Thr. x)

N = length (x);

Nv = 0; for (i = 0:N-1) if(x(i*1)>Thr)

Nv = Nv ♦ t: end end

rf (N > 0)

Fd = Nv/N; else Fd = 0; end

%-

function s = PO_WinAvg (L. x)

N = length (x); s = 0;

for (i = L-1:N-1) t = 0;

for (m = 0:L-1)

t = t ♦ sqrt (x(i-m+1)); end

s * s ♦ (t / L)*4: end

if (N >= L)

s = sqrt (s/(N - L ♦ 1)); end

%--

function s = PO_WlAvg (x. W)

N = length (x);

s = 0; sW = 0; for (i = 0:N-1)

s = s^ W(rM)‘x(i^t); sW = sW ♦ W(i+t); end

if (N > 0) s = s / sW; end

%-

function LinAvg = PQJJnAvg (x)

N - length (x); s = 0;

for (i = 0:N-1) s = s ♦ x(i+1): end

LinAvg = s / N;

%-

function RMSAvg = PO_RMSAvg (x)

N = length (x); s = 0;

for (i = 0:N-1) s = s ♦ x(i+1)A2: end

if (N > 0)

RMSAvg = sqrt(s / N): else

RMSAvg = 0; end

function PQframeMOV (i. MOVI) global MOVC

[Nchan. Nc] = size (MOVC.MDiff.Mt1B);

for (j = 1:Nchan)

% Modulation differences

MOVC.MDiff .Mt 1    1) = MOVI(j).MDifl.Mt1B;

MOVC.MDiff.Mt2B(j.’+1) = MOVI(j)MOff.Mt28;

MOVC.MDiff .Wl(j.i* 1) « MOVI(j).MOiff.Wt;

% Noise loudness

MOVC.NLood.NL(j.i+1) = MOV1(j).NLoud.NL:

% Total loudness

MOVC.Loud.NRef(j,i+1) = MOVl(j).Loud.NRef; MOVC.Loud.NTesl(j.i*1) = MOVI(j).Loud.NTest;

% Bandwidth

MOVC.BW.BWRef(j,i+1) = MOVI(j).BW.BWRef; MOVC.BW.BWTesl(j.i*t) = MOVI(i)BW.BWTesU

% Noise-to-mask ratio

MOVC.NMR.NMRavg(j>1) * MOVI(j).NMR.NMRavg: MOVC.NMR.NMRmax(j.«*1) * MOVI(j).NMR.NMRmax;

% Error harmonic structure MOVC.EHS.EHS(j.i+1) = MOVI(j).EHS.EHS; end

% Probability of de tec bon (collapse frequency bands) (MOVC.PD.Pc(i*1), MOVC.PD.Oc(i*1)] = PO_ChanPD (MOVI);

%.-------

function (Pc, Oc| = PQ_ChanPO (MOVI)

Nc = length (MOVI(1 ).PD.p);

Nchan = length (MOVI);

Pr= 1:

Oc = 0; if (Nchan > 1) for (m =0:No1)

pben = max(MOVI(1).PD.p(m*1). MOVI(2).PD.p(m*1)); qbin = max (MOVI(1).PD.q(m*1). MOVI(2).PD.q(m*1));

Pr = Pr * (1 - pbin);

Qc = Qc ♦ qbin; end else

for (m = 0:Nc-1)

Pr = Pr • (1 - MOVI.PD.p(m+1));

Qc = Qc ♦ MOVl.PD.q(m*1); end end

Pc = t - Pr;

function Ndel = PQIoudTest (Loud)

[Nchan. Np] = size (Loud.NRef);

Thr = 0.1;

Ndel = Np;

for (j = 0:Ncharv1)

Ndel = min (Ndel, PQ_LThresh (Thr. Loud.NRef(j+1.;). Loud.NTest(j*1.:))); end

%-

function it = PQ_LThresh (Thr. NRef, NTest) Np = length (NRef): it = Np;

for (i = 0:Np-1)

if (NRef(i+1) > Thr & NTest(i*t) > Thr) it = i: break; end end

function BW = POmovBW (X2)

persistent kx kl FR FT N

if (isempty (kx))

NF = 2048;

Fs = 48000: fx = 21586:

kx = round (fx 1 Fs * NF):    % 921

П = 8109;

kl = round (П / Fs * NF): % 846 FRdB = 10:

FR = lO^FRdB/ 10):

FTdB = 5:

FT = 10A(FTdB/10):

N = NF / 2;    % Limit from pseudo-oode

end

Xth = X2(2.kx*1); for (k = kx*1:N-1)

Xth = max (Xth. X2(2,k*1)); end

BW.BWRef = -1;

XthR = FR • Xth: for (k = kx-l:-1:kl+1) if (X2(1,k*1) >= XthR)

BW.BWRef * к ♦ 1; break: end end

BW.BWTest = -1:

XthT = FT * Xth; for (k = BW.BWRef-11:0) if (X2(2,k«-1) >= XthT)

BW.BWTest = к ♦ 1; break; end end

function MDiff = POmovModDiffB (M. ERavg)

persistent Nc Ete

if (isempty (Nc)) e =0.3;

(Nc. fc) = POCB ("Basic*);

Et = POIntNoise (fc); for (m = 0:Nc-1)

Ete(m+1) = Etfm+I^e; end end

negWl2B = 0.1; offset 1В = 1.0; offset2B = 0.01; levWt = 100;

sIB =0; s2B = 0;

Wl = 0;

for (m = 0;Nc-1)

if (M(1 ,m*1) > M(2.m*1)) num 1B * M(1.m+1)-M(2.m+1}; num2B = negW(2B * num1B: else

num1B * M(2.m*1) - M(1tm*1); num2B = num1B: end

MD1B = num1B/(offsetIB ♦ M(1,m*1)):

MD2B - num2B / (offset2B ♦ M(1.m*1)): s1B = s1B ♦ MD1B; s2B = s2B ♦ MD2B;

W1 = Wl ♦ ERavg(m+1)/(ERavg(m*1) ♦ levWt ‘ Ete(m+1)); end

MDtff.M11 В = (100/Nc)4 sIB:

MDiff.M12B = (100 f Nc)* s2B:

MDrff.Wt = Wt;

function NL = PQmovNLoodB (M. EP) persistent Nc Et

if (isempty (Nc))

(Nc. fc] = PQCB ('Basic');

Et = PQIntNkxse (fc); end

alpha = 1.5;

TF0 « 0.15;

SO = 0.5;

NLmin = 0; e = 0.23;

s = 0;

for (m = 0:Nc-1)

sref * TF0 * M(1.m+1) ♦ SO; stest = TF0 * M(2.m+1) ♦ SO;

beta = exp (-alpha * (EP(2.m+1)- EP(1.m+1)) t EP(l.nvM)); a = max (stest * EP(2,m+1) - sref * EP(1.m+1), 0); b = El(m+1) ♦ sref * EP(1fm*1) * beta; s = s ♦ (Et(m+1) / stest)*e * ((1 ♦ a/b)*e -1): end

NL = (24 / Nc) * s; if (NL < NLmin)

NL * 0; end

function NMR = POmovNMRB (EbN. Ehs) persistent Nc gm if (isempty (Nc))

(Nc. fc. Л. fu. dz] = PQCB (Basic*): gm = PO_MaskOffset (dz. Nc); end

NMRNMRmax = 0; s = 0;

for (m = 0:Nc-1)

NMRm = EbN(m* t) / (gm(m* 1) * Ehs{m+1));

s = s ♦ NMRm:

ft (NMRm > NMR NMRmax)

NMR.NMRmax = NMRm; end end

NMR.NMRavg = s / Nc;

%-----------

function gm = PQ_MaskOffset (dtz. Nc)

tor (m = 0:Nc-1) if (m <= 12 / dz) mdB = 3: else

mdB = 0.25 * m * dz: end

gn^m+l) = 10A(-mdB /10): end

function PD = PQmovPD (Ehs)

Nc = length (Ehs):

PD.p = zeros (1. Nc):

PD.q = zeros (1. Nc):

persistent c g d1 d2 bP bM

if (isempty (c))

c = (-0.1987190.0550197 -0.00102438 5.05622e-6 9.010330-11]; d1 = 5.95072: d2 = 6.39466: g = 1.71332: bP = 4; bM = 6; end

for (m = 0:Nc-1)

EdBR = 10 * log 10 (Ehs(1.rT*>1));

EdBT = 10 * log 10 (Ehs(2.m*1)); edB = EdBR - EdBT; if (edB > 0)

L = 0.3 ' EdBR ♦ 0.7 * EdBT; b = bP: else

L = EdBT; b= bM; end

rf <L > 0)

s = d1 * (d2 / L^g ...

♦ c(1) ♦ L * (c(2) ^ L • (c{3) ♦ L * (c(4) ♦ L • c(5))));

else

s =1e30: end

PD.p(m*1) = 1 - 0.5A((edB / s)^):

PD.q(m*1) = abs (fix(edB)) / s: end

function POprtMOV (MOV. ODG)

N = length (MOV);

PQ NMOV B* 11: PO_NMOV_A = 5:

fprintf ('Model Output Variables:\n‘): if (N == PO_NMOV_B) fprintf (‘ BandwidthRefB: %g\n\ MOV(t)); fprintf (a BandwidthTestB: %g\n\ MOV(2)); fprintf (‘ Total NMRB: %g\n\ MOV(3)): fprintf (' WinModDrfMB: %g\n', MOV(4)); fprintf (•    ADBB %g\n\ MOV(5));

fprintf (a    EHSB: %gVi'. MOV(6));

fprintf (• AvgModDiff 1B: %gVn*. MOV(7)); fprintf (a AvgModDiff2B: %gVn*. MOV(8)): fprintf (' RmsNoiseLoudB: %g\n\ MOV(9)); fprintf (•    MFPDB: %g\n\ MOV(10));

fprintf (' RelDistFramesB: %g\n\ MOV(11)>; eiseH (N == NMOV_A) fprintf (•    RmsModDiffA: %g\n\ MOV(1)):

fprintf (' RmsNoiseLoudAsymA: %g\na. MOV(2)); fprintf (‘ Segmental NMRB: %g\n\ MOV(3)); fprintf (a    EHSB: %g\n\ MOV(4)).

fprintf ('    AvgUnOslA: %g\n\ MOV(5));

else

error (‘Invalid number of MOVs*); end

fprintf ('Objective Difference Grade: %.3f\n', ODG); return: function POprtMOVCi (Nchan. i. MOVC) fprintf ('Frame: %d1n\ i);

if (Nchan == 1)

fprintf (’ Ntot : %g %g\n\ ...

MO VC. Loud. N Ref (1 .K1). MOVC.Loud.NTestf 1 .i* 1)); fprintf (‘ ModDiff: %g %g %g\n\...

MOVC.MDrff.Mt1B(1.i*1). MOVC.MDifl.Mt2B( 1 ,i* 1). MOVC.MDifT.Wt(1.f*1)>; fprintf (' NL : %g\na. MOVC.NLoud.NL(1 ,r*1)); fprintf (' BW : %g %g\n\...

MOVC.BW.BWRef( 1. i* 1), MOVC BW.BWTest( t > 1)); fprintf (’ NMR : %g %g\na....

MOVC.NMR.NMRavg(1.i*1). MOVC.NMR.NMRmax(1,r*1)); fprintf (‘ PO : %g %g\n'. MOVC.PD.Pc(i* 1). MOVC.PD.Qc(i* t )y fprintf (' EHS : %g\n\ 1000 * MOVC.EHS.EHS(1.i*1)): else

fprintf (' Ntot : %g %g // %g %g\n\...

MOVC.Loud.NRef(1.i*1). MOVC. Loud. NTest(1.i*1),...

MOVC.Loud.NRef(2.i* 1). MOVC.Loud.NTest(2.i*1)): fprintf (' ModDHf. %g %g %g tt %g %g %g\n\ ...

MOVC.MDifT.Mt1B(t.i+1), MOVC.MOHT.Mt2B(1.i*1). MOVC.MDrff.Wt(1.i*1),...

MOVC.MDiff.Mt1B(2.»*1), MOVC.MDiff.Mt2B(2.i*1). MOVC.MDfff.W1(2.i*1)); fprintf (' NL : %g // %g\n‘....

MOVC.NLoud.NL(1,r*1)....

MOVC. N Loud. NL(2.i*1)); fprintf (' BW : %g %g // %g %g\n\...

MOVC.BW.BWRef(1.r*1). MOVC.BW.BWTest(1.i*1). ...

MOVC.ВW.ВWRef(2.•♦ 1). MOVC.BW.BWTest(2.i*1)): fprintf (‘ NMR : %g %g /I %g %g\n\ ...

MOVC.NMR.NMRavg( 1.i*1), MOVC.NMR.NMRmax(1.i*1),...

MOVC. NMR NMRavg(2.i* 1). MOVC .NMR. NMRmax(2.i* 1)): fprintf (‘ PO : %g %g\n'. MOVC.PD.Pc(i*1). MOVC.PD.Oc(i*t)>; fprintf (‘ EHS : %g // %g\n',...

1000 * MOVC .EHS. EHS( 1.1*1)....

1000 • MOVC.EHS.EHS(2.i*1)): end

function EHS = PQmovEHS (xR. xT. X2)

persistent NF Nadv NL M Hw

if (isempty (NL))

NF = 2048;

Nadv = NF /2;

Fs = 48000:

Fmax = 9000;

NL = 2/'(POJog2(NF ' Fmax / Fs));

M = NL;

Hw = (1 / M) * sqrt(8 / 3) * POHannWin <M); end

EnThr = 8000; kmax = NL ♦ M -1:

EnRef = xR(Nadv^1:NF-U1)fc xR(Nadv^1:NF-Ht)i; EnTest = xT(Nadv+1:NF-1*1) * xT(Nadv*1:NF-1+1)’; if (EnRef < EnThr & EnTest < EnThr)

EHS = -1; return; end

D = zeros (1. kmax): for (k = 0:kmax-t)

D(k^t) = log (Х2(2.к*И)/ X2(1,k**1)); end

C = PQ_Corr (D. NL. M);

Cn = PO NCorr (C. D. NL. M);

Cnm = (1 / NL)' sum (Cn(1 :NL));

Cw = Hw .* (Cn - Cnm);

% OFT

cp = PQRFFT (Cw. NL. 1); c2 = PQRFFTMSq (cp. NL):

EHS = PO_FmdPeak (c2. NL/2+1);

%--------

function fog2 = PQ_tog2 (a)

tog2 = 0; m = 1;

white (m < a) tog2 = log2 ♦ 1; m = 2 * m; end

fog2 = log2 -1;

%--

function С = PO_Corr (D. NL M)

NFFT = 2 * NL:

DO = (D(1:M) zefos(I.NFFT-M)):

D1 = |D(1:M*NL-1)zeros(1.NFFT-(M*NL-1))l;

dO = PORFFT (DO. NFFT. 1); dl = PORFFT (D1. NFFT. 1);

dx(0+1) = d0(0+t)* d1(0+1): for (n = 1:NFFT/2-1) m = NFFT/2 ♦ n;

dx(n*1) = d0(n+1) * d1(n+t) ♦ dOfrn^l) * d1(m«>1): dx(m*1) = d0(n+1) * d1(m+1) -d0(m+1) • d1(n+1); end

dx(NFFT/2*1) = dO(NFFT/2^1) * d1(NFFT/2*1);

% Inverse DFT

Сх = PORFFT (dx. NFFT. -1);

C=Cx(1:NL);

%.---

function Cn = PQ_NCorT (C. D. NL. M)

Cn = zeros (1. NL):

s0 = C(0+1); sj = s0:

Cn(0*1) = 1; for (i» 1:NL-1)

sj = sj ♦ <D(»*M-1M)*2- DCi-m^); d = sO * sj; if (d <= 0)

Сл(г*1) = 1; else

Cn(i+1) = C(M) / sqrl (d); end end

function EHS = PO_FindPeak (c2. N)

cprev = c2(0+1); стах = 0; for (n = 1:N-1)

if (c2(n*1)> cprev) % Rising from a valley if (c2(n*1)> стах) стах = c2(n+t); end end end

EHS = стах;

function (EP. FmemJ = POadapt (Ehs. Fmem. Ver. Mod)

persistent a b Nc Ml М2 Version Model

if (-strcmp (Ver. Version) | -strcmp (Mod. Model)) Version = Ver;

Model = Mod; if (strcmp (Model. ’FFT))

(Nc. fc| = POCB (Version);

NF = 2048:

Nadv = NF /2; else

(Nc. fc] = POFB;

Nadv * 192; end

Version = Ver;

Model = Mod;

Fs= 48000;

Fss = Fs / Nadv;

И00 = 0.050: tmin = 0.008;

(a b] = POtConst (1100. tmin. fc. Fss);

(M1. М2] = PQ.M1M2 (Version. Model); end

EP = zeros (2. Nc);

R = zeros (2. Nc);

5Л = 0;

sd = 0;

for (m = 0:Nc-1)

Fmem.P(1.m*1) = a(m*1) * Fmem.P(1.m*1) + b(m+1) * Ehs(1,m*1); Fmem.P(2.m+1) = a(m*1) * Fmem.P(2.m*1) ♦ b(m+1) * Ehs(2.m*1); sn = sn ♦ sqrt (Fmem.P(2.m+1) * Fmem.P(1.m+1)); sd = sd ♦ Fmem.P(2.m*1); end

CL = (sn / sd)*2; for (m = 0:No1)

if (CL > 1)

EP(1,m+1) = Ehs(1.m+1)/CL:

EP(2.m+l) = Ehs(2.m+1); else

EP(l.nvM) = Ehs(1.m+1):

EP(2.m+t) = Ehs(2.m*1) * CL: end

Fmem.Rn(m+1) = a(m*1) * Fmem.Rn(m*1) ♦ EP(2.m^1) “ EP(1.m*t): Fmem Rdfm<H) = a(m*1) * Fmem.Rd(m*1) ♦ EP(1,m*1) * EP(1.m+l); if (Fmem.Rd(m+1) <= 0 | Fmem.Rn(nvM) <= 0) error ('»> POadap: Rd or Rn is zero'); end

if (Fmem.Rn(m+1) >= Fmem.Rd(fTV*1))

R(1,m+1) = 1;

R(2,m+1) = Fmem.Rd(m+1)/ Fmem.Rn(m+t); else

R(1.m+1) = Fmem.Rn(m+1)/ Fmem.Rd(m+1):

R(2,m+1)= 1; end end

for (m = 0:No1) iL = max (m - Mt, 0): iU = min (m ♦ М2. Nc-1): s1 =0; s2 =0: for (i = iL:»U) s1 =s1 ♦ R( s2 = s2 ♦ R(2.i*1); end

Fmem.PC(l.m^l) = a(m+1) * Fmem.PC(1.m+1) ♦ b(m*t) • s1 / (iU-iL+1); Fmem.PC(2.rm1) = a(m+1) * Fmem.PC(2.m+1) ♦ b(m*1) “ s2 / (iU-iL+1):

EP(1,m+1) = ЕР(1.тИ) * Fmem.PC(1,m+1);

EP(2,m+1) = EP(2,m+1)■ Fmem.PC{2.m>1); end

%--------

function (M1. М2) = PQ_M1 М2 (Version. Model)

if (strcmp (Version. 'Basic'))

Ml =3;

М2 = 4;

elseif (strcmp (Version. 'Advanced')) if (strcmp (Model. *FFT)>

Ml = 1;

М2 = 2; else Ml = 1;

М2 = 1: end end

function Ntot = PQIoud (Ehs. Ver. Mod) e = 0 23;

persistent Nc s Et Ets Version Model

if (-stncmp (Ver. Version) | -strcmp (Mod. Model))

Version = Ver,

Model = Mod: if (stncmp (Model. ’FFT))

[Nc. fcj = POCB (Version): c= 1.07664: else

(Nc. fcj = POFB: c= 1.26539; end

E0 = 1e4;

Et = PO_enThresh (fc): s = PQ_ex)ndex (fc): for (m = 0:Nc-1)

Ets(m+1) = c • (Et(m+1)/ (s(m+1) * Е0)Ге: end end

sN =0;

for (m = 0:Nc-1)

Nm = Ets(m*1) * <(t - ${m* 1) ♦ s(m*1) • Ehs(m*1) / Et(m*1 ))Ae - 1); sN = sN ♦ max(Nm. 0); end

Nlot = (24 / Nc)# sN:

%====================

function s = PQ_exlndex (f)

N = length (f); for (m = 0:N-1)

sdB = -2 - 2.05 * atan(f(m*1) 14000) - 0.75 * atan((f(m*1) 11600^2); s(m*1) = 10A(sdB /10): end

%.------

function Et = PQ_eoThresh (f)

N = length (f); for (m = 0:N-1)

EldB = 3.64 • (ftm^1)/ 1000УЧ-0.8);

Et(nvM) = W^EtdB /10): end

function [M. ERavg. Fmem) = PQmodPatt (Es. Fmem)

persistent Nc a b Fss

if (isempty (Nc))

Fs = 48000:

NF = 2048:

Fss = Fs / (NF/2);

[Nc. fc] = PQCB (’Basic*):

(100 = 0050.

Ю = 0.008:

[a. b] = PQtConst (t100. tO. fc. Fss): end

M = zeros (2. Nc):

о = 0.3: for (i* 1:2)

for (m = 0:Nc-1)

Ее = Esfi.m+I^e;

Fmem.DE(i.m+1) = a(m*1) * Fmem.DE(i.m*1)...

♦ b(m+1) * Fss ' abs (Ее - Fmem.Ese(i.m+1)); Fmem.Eavg(i.m+1) = a(m*1) * Fmem.Eavg(i.m+1) ♦ b(m*1) * Ее: Fmem.Ese(i,m*1) = Ее:

M(i.m*1) = Fmem.DE(i.m*1)/ (1 ♦ Fmem.Eavg(i,m+1)/0.3); eod end

ERavg = Fmem.Eavg(1,:);

Б.2 Листинг программы расчета метрики PEAQ на языке С Файл: common.h

«define DEBUG «define HANN 2048 «define BARK 109

«define DOUBLE

«if defined( DOUBLE)

«define modute(x) fabs((doubte) x)

«define p(x.y) pow((double)x, (double)y)

«elif defined (LDOU В LE)

«define modute(x) fabs)((iong double) x)

«define p(x.y) powf{(!ong double)x. (long double)y)

«endif

«defined 1.0

«define AVGHANN «define SKIPFRAME «define GETMAX

«define Fup 18000.0 «define Flow 80.0 «define PATCH 1

Г................^ *.................*......./

Г*........................* peaqb......................."/

«define LOGVAR1ABLE

«ifdef LOGVARIABLE «define LOGALLFRAMES «endif

Г.............................end *......................../

struct processing (

double fftref(HANN/2); double ffttest(HANN/2]: double ffterefIHANN/2]: double fftelest[HANN/2): double fnoise[HANM/2]; double pptesi|BARK]: double ppreflBARK): double ppnoise(BARK]; double E2test(BARK): double E2ref|BARK): double Etest(BARK]; double EreflBARK): double MnefJBARKJ; double Modtest[BARKJ; double ModreflBARK]:

Файл: peaqb.h

«define LOGRESULT "analtzed* #>fdef DEBUG

«define LOGFILE "debugged.Ь(Г «er>dif

«define OPT REF 0x01 «define OPT_TEST 0x02

«define THRESHOLDDELAV 0.050 «define AVERAGINGDEALAY 0.5

«define B(f) 7 * asir>h< (double)! /650)

«define Bl(z) 650 4 sinh((double)z П)

Г Function prototypes V void fatalerr(char void usage(char *):

void logvariable<const char double \ int): void ProcessFrame(sigr>ed int *. signed int *. int signed int \ signed int *, int. int, int. int);

Г Prototypes end 7

Файл: peaqb.c «include <stdio.h>

«include <stdK>.h>

«include <string.h>

«include <stdarg.h>

«include <getopt.h>

«include <asserth>

«include <math.h>

«include <fftw.h>

«include <oommon.h> «include <wavedump.h> «include <getframe.h> «include <bandwidth.h> «include <levpatadapt.h> «include <moddiff.h> «include <modulat«on.h> «include <loudness.h> «include <neural.h>

«include <nmr.h>

«include <detprob.h> «include <energyth.h> «include <harmstructh> «include <boundary.h> «include <cntbandgnoup.h> «include <eamx)delffl.h> «include <noiseloudness.h> «include <reldistframes.h> «include <spreading.h> «include <timespreading.h> «include <threshotd.h> «include <peaqb.h>

extern int ermo:

char Tilenaf. ‘filetest:_

double hannwindow(HANN);

double Etesttmpch1(BARK]. EtesUmpch2[BARK]. EreflmpcM|BARK).

E/eftmpch2(BARK), Cffttmpch 1 (HANM/2). Cffttmpch2lHANI*2): int delaytime 1. delaytme2; int count = 0: int harmsamples = 1: fftw_plan plan. plan2:

Г Bark Tables 7 double *fL. VC. VU; int bark:

struct levpatadapta levinchl. Ievinch2;

struct modulationin modinteslchl. modintestch2. modirvefcM. modfflnafch2; struct moddrffin moddiffinchl, moddiffinch2: struct bandwidthout bandwidthchl. bandwidthch2; struct outframes prooessed:

int

main(int argc, char ‘argvQ)

{

signed int cMreflHANNJ: signed int ch2reflHANNj: signed int ch1tesl(HANN]: signed int ch2tesl(HANN]:

int opt_kne = 0:

int rateref. numchref. bitsampleref. Ipref: int ratetest. numchtest. bitsampletest. Iptest: int boundflag. totalframes = 0;

FILE Vpref. Vptesl;

struct boundaryftag bound be = (0. 0}: struct out oveRet

Г Parse command line V rf (argc < 3)

usage(argvtO]);

{

int c = 0:

white ((c = getopt(argc. argv. "rtih")) != EOF) switch (c) { case 'h*:

usage(argv[0]): break: case 'Г:

optjine |= OPT_REF; fileref = optarg: break: case T:

optjine |= OPT_TEST; filetest = optarg: break:

)

}

Г Input control V

if (!(optJ»ne & OPT_REF) || ITileref)

fatalerT f err: чУ-reference <arg> required"):

if (! (optjine & OPTJTEST) || !*Wetesl) fatalerT ferr: -tMest <arg> requirecf):

Ipref = LeveiPression(fileraf):

Iptest = LevelPression(ffetest);

/• Init routines V

it make Hann Window (2.1.3)

{

int k;

for(k=0;k<HANN;k*+)

hannwindow{k] = 0.5‘sqrt ((double )8/3)'

<1-cos((doobie)2’M PI*k/(HANN-1)));

)

ft make Bark tables (2.1.5)

{

int k;

double zL. zU: double “zl. 4zc. *zu; zL = B<Flow): zU = B(Fup):

bark = ceil((zU - zL) / dz); fL = (double *)malloc(bark4 sizeof (double)); fC = (double *)malloc(bark * sizeof(double)); fU = (double *)malloc(bark 4 sizeof (double)): zl = (double 4)malk>c(bark * sizeof(double)): zc = (double *)malloc(bark 4 sizeof (double)); zu = (double 4)malloc(bark * sizeof(doubte)); assert(fL != NULL && fC != NULL && fU != NULL && zl != NULL && zc != NULL && zu != NULL);

foc(k=0;k<bark;k**) { zl(k) = zL ♦ k*dz; zu(k) = zL ♦ (k+t)4dz; zc[k] = 0.5 4 (zf k] ♦ zu[k));

)

zu[bark-1J = zU;

zc[bark -1] = 0.5 * (zl[bark-1] ♦ zu(bark-IJ);

for(k=0;k<bark;k^^) { fL(k) = Bl(zl(k)); nj[k) = Bf(zu(k)); fC(kJ = BI(zo[k]);

)

free<zl);

free(zu);

free(zc):

)

// Initialize temp var

memset(&levinch1. 0x00. sizeof(struct levpatadaptin)); memset(&levinch2. 0x00. sizeoffstruct levpatadaptin));

memset(&modintestch1. 0x00. sizeof struct modiiationin));

memset(&modintestch2. 0x00. sizeof(struct modiiabooin)): memset(&modinrefcb 1,0x00. sizeof(struct modutationin)); memset(&modinrefcb2. 0x00. sizeof(struct modulationin));

memsel(Etesttmpch1. 0x00, BARK4 sizeof(double)); memset(Etesttmpch2. 0x00. BARK4 sizeof (double)); memset(Ereftmpch1. 0x00, BARK * sizeof (double)); memset(Eraftmpch2. 0x00. BARK * sizeof(double)); memset(Cffttmpch1.0x00. (HANW2)4 sizeof(double)); memset(Cffttmpch2.0x00. (HANN/2) * sizeof (double)):

memseU&moddtffinchl. 0x00. sizeof(struct moddiffin)); memset(&moddrffinch2, 0x00. sizeof(struct moddiffin));

memset(&bandw»dthch1, 0x00. sizeof(struct bandwidthout));

memset(&bandw»dthch2. 0x00. sizeof(struct bandwidthout));

ft ref file

if ((fpref = fopenffileref.V)) == NULL) fatalerr(*err: %s". strerror(errno)); if ((rateref = SampieRate( fpref)) == -1) fatalerrferr; error in WaveHeader"): if ((numchref = NumOfChan(fpreO) == -1) fatalerrferr: error in WaveHeader"): if {(bitsamplenef = B4ForSample(fpref)) == -1) fatalerrferr: error in WaveHeader"): if(FindData<fpreO == -1)

fatalerr(*err: can't find Data Field*):

ft test file

if ((fptest = fopen(fitetest.V)) == NULL) fatalerr(*err: %sm, strerTor(errno));

К ((ratetest = SampleRate(fptest)) == -1) fatalerrferT: error in WaveHeader*): if ((numchtest = NumOfChan(fptest)) == -1) fatalerrferr: error in WaveHeader*): if ((bitsampletest = BitForSample(fptest)) == -1) fatalerr(*err: error in WaveHeader*): if(FindData(fptest) — -1)

fatalerr(*err: can't find Data Field*):

fprintffstdouLln PEAQb Algorithm. Author Giuseppe Gottardi 'oveRet'* * <>\n"):

fpnntf(stdout.*ViRef File %s"

*\n - Sample Rate: %d"

*\n - Number Of Channel: %d"

*\n - Bits for Sample: %d"

*\л - Level Playback: %d\n\n*. fileref. rateref. numchref. bitsampteref. fpref);

fphntf(stdout.*>nTesl File %s*

*\n • Sample Rate: %d*

*\n - Number Of Channel: %d"

*\n - Bits for Sample: %d"

"\n - Level Playback: %d\n\n*. filetest. ratetest. numchtest. bitsampletest Iptest):

ft Processing if(ratetest != rateref)

falalerr(*err: Can't process Wave Files with different Sample Rate*); if(numchref != numchtest)

fatalerr(*enr: Can't process Mono Wave with Stereo Wave*);

ft Find delay time 1 for Loudness Threshold

delaytime 1 = ceil f((fk>at)THRESHOLDDELAV*ratetest>2/H ANN);

ft Find delaytime2 for Delayed Averaging

delaytime2 = ceilf((fk>at)AVERAGINGDEALAY*ratetest*2/HANN);

ft make fft plan

plan = fftw_create_plan( HAN N. FFTW_FORWARD. FFTW_MEASURE);

wh»le(harmsamples < (Fup/rate test)* (HAN N/2.0^2.0) harmsamples *= 2:

plar\2 = fftw_createj>Jan(harmsamptes. FFTW_FORWARD. FFTW_MEASURE);

if(numchref == 1) {

if (fseek(fpref. (HANN/2)‘bnsampleraf/8. SEEK.CUR) == -1) fataterrferr. %s*. strernx(ermo)); if (fseek(fptest. (HANN/2)*bitsampletest/8. SEEK_CUR) == -1) fatafernTerr. %s". strerrur(errno)):

#»fdef DATABOUNO.BE #undef DATABOUND ONE (

int i = 0, Rag = 0. И. f2; long dataref, datatest, br1. br2;

dataref = ftel(fpref): dalalesl = ftell(fptest);

wMe(1){

br 1 = ftell(fpref);

Ы2 = ftell(tptest);

f1 = GetMonoFrameffpref. (signed int ’Jchlref. bitsampleref/S. HANN);

(2 = GetMonoFrame(fptest. (signed int *)ch1tesL bitsampietest/8. HANN);

if(f1 && f2) { totafframes**:

rf(boundary(ch 1 ref. chltest. NULL. NULL. HANN) && !ftag) ( boundbe.begin = totalframes;

Rag = 1;

}

>

else {

fseek(fptest. brl. SEEK SET): fseek(fpref, br2, SEEK~SET); break:

>

fseek(fptest. -<HANN/2)*bitsampie<eslB. SEEK.CUR):

fseek(fpref. -(HANN/2)'bitsampleref/8. SEEK.CUR): while(i<totalfrarT>es) (

GetMonoFrame(fpref. (signed int *)ch1ref, bitsampleref/8. HANN); GetMonoFrame(fptest. (signed int *)ch1tesl. bitsampletest/8, HANN): fseek(fptesl. -2*(HANN/2)*bitsampletest/8. SEEK.CUR): fseek(fpref. •2*(HANN/2)*bctsamplere(/8. SEEK.CUR). i^+;

if (boundary (ch 1 ref. chltest. NULL. NULL. HANN)){ boundbe.end = totalframes-i: break;

)

>

fseek(fptest. datatest. SEEK.SET), fseek(fpref. dataref. SEEK.SET);

>

#endif

while (GetMonoFrame(fpref. (signed int *)ch1ref. bitsampleref/S. HANN)

&& GetMonoFrame(fptest. (signed int *)ch1test. bitsampletest/8. HANN)) {

count* ♦:

#ifdef DATABOUNO.BE

if(count >= boundbe.begin && count <= boundbe.end) bound flag = 1;

else

boundflag = 0:

#etse

boundflag = boundary(ch1ref. chltesL NULL. NULL. HANN): fcfdef DATABOUND ONE {

static ini ftagl = 0. flag2 = 0; rf(boundftag && !flag1) flagl = 1;

if(!boundflag && flagl) flag2 = 1; if(flag2)

boundflag = 0:

)

tfendif

ftendif

ProcessFrame( (signed int *)ch1nef.

(signed int *)NULL. Ipref.

(signed int *)ch1tesL (signed int *)NULL.

Iptest. rateref. boundflag. HANN);

oveRet = neural(processed);

fprintffstdout.Enframe: %d"

tfifdef DATABOUN D.BE 7%d" "Nndata boundary: %d -> %d" tend if

'ViBandwidthRefb: %g*

"\nBandw>dthTeslb: %g*

"\nTotalNMRb %g*

"\nWtnModDiff1b: %g9 "ViADBb: %g"

"VnEHSb: %g"

"\nAvgModDiff1b: %g-“VnAvgModDiff2b %g*

”\nRfnsNoiseLoudb: %g"

•ViMFPDb: %g*

"UiRelDtstFramesb: %g*

“NnDI: %g*

"\nODG: %g\n", count.

tfifdef DATABOUND.BE

totalframes. boundbe.begin. boundbe.end.

ttendcf

processed BandwidthRefb.

processed.BandwklthTestb, processed. TotaINMRb. proce ssed. WmModDifHb. processed.ADBb. processed.EHSb. processed. AvgModDHf 1b. proce ssed. AvgMod Diff2b. p recessed.RmsNorseLoudb. processed.MFPDb. proce ssed. RelDcstf ramesb. oveRet. Dl. oveRet.ODG):

}

{

FILE *res:

res = fopen(LOGRESULT.’a^"); fprintf(res.lnR4e: %s\n"

"Snframe: %d"

"\nBandw»dthRefb: %g"

"viBandwidtbTeslb: %g*

TnTotalNMRb %g"

•\nWinModDtfHb: %g"

ЛпАОВЬ: %q-•\nEHSb: %Qe *\nAvgModD»1T1b: %g"

*V\AvgModDifT2b %g"

"VnRmsNoiseLoudb: %g"

•\nMFPDb: %g"

*\nReiDistFramesb: %g"

*\nDI: %g*

"\nOOG: %g\n\

filetest, count, processed.BandwidthRefb, processed. BandwidthTestb, processed.TotaJNMRb. processed.WinModDtf! 1b. processed.AOBb. processed.EHSb. processed. AvgModDifTIb, processed.AvgModDrf!2b.

processed.RmsNoiseLoudb, processed.MFPDb. processed. Re) DistF ramesb. oveReLDI. oveRetODG):

fdose(res);

)

if(numchref == 2) {

if (fseek(fpref. HANN'bitsampleref/8. SEEK.CUR) ==-1) fataterrferr. %s". strerror(ermo)); if (fseek(fptest, HANN'bitsampletest/8. SEEK_CUR) == -1) fataterriferr %s". strerror(errno)):

#ddel DATABOUND BE #undef DATABOUND ONE

( ' int i = 0. flag = 0.11. f2; long dalaref. datatest. br1, br2;

dataref = ftei(fpref); datatest = ftell(fptest);

wNle(1){

br1 = ftell(fpnef); br2 = ftell(fptest);

f1 = GetStereoFrame(fpfef. (signed int *)ch1ref.

(signed int *)ch2ref. bitsampteref/8. HANN); f2 = GetStereoFrame(fptest. (signed int *)cii1test.

(signed int *)ch2test bitsamptetest/8. HANN);

if(f1 && (2) { totatframes**;

if(boundary(ch1ref. chltest. cb2ref. ch2test. HANN) && Iflag) ( boundbe.begin = totalframes;

Rag = 1;

}

)

else {

fseek(fptest. brl.SEEK.SET): fseek(fpref, Ы2, SEEK.SET); break;

)

>

fseek(fptest. -HANN'bitsamptetest/8. SEEK.CUR); fseekjfpref. -HANN'bitsampleref/8. SEEK.CUR); \vhile(i<totalframes) {

GetSlereoFrarT>e<fpref. (signed int *)ch1ref.

(signed int *)ch2ref. bitsampiere(/8. HANN);

GetStereoFrame(fptest. (signed int *)cMtest.

(signed int *)ch2test. bitsampletest/8. HANN); fseek(fptest. -2*HANN‘bilsamplelest/B. SEEK_CUR); fseek(fpref. -2*HANN*bitsampleref/8. SEEK.CUR); i**:

if(boundary(ch1nef. chltesL ch2ref. ch2test, HANN» ( bo and be. end = totalframesH*1:

break:

}

)

fseek(fptest datatest. SEEK_SET); fseek(fprer. da tare f. SE£K_SET);

}

#endif

wtiile (GetStereoFrame(fpref. (signed int а)сИ1гвГ.

(signed int *)cti2raf. bitsampleref/3, HANN)

&& GetStereoFrame(fptest. (signed int ")ch1test.

(signed int *)ch2test. bitsamptetest/8. HANN)) (

count**;

tfifdef DATABOUND.BE

if( count >= bound be. beg in && count <= boundbe.end) boundflag = 1; else

boundflag = 0:

#e4se

boundflag = boundaryfchlref. chltest. ch2ref. ch2test. HANN); tfifdef DATABOUND ONE (

stabc int flagl = 0. Лэд2 = 0;

if(boundftag && !flag1)

Яад1 = 1;

if(!boundf1ag && flagl) flag2 = 1; if(flag2)

boundflag = 0:

)

#endif

ftendif

PnocessFrame((signed int *)ch1nef,

(signed int a)ch2rBf. Ipref,

(signed int *)ch1test.

(signed int a)ch2test

Iptest, rateref. boundflag. HANN);

oveRet = neural(processed);

fprintf(stdout*\nframe: %d"

ffifdef DATABOUND.be 7%d"

"\ndata boundary: %d -> %d"

#eodrf

'ViBandwdthRefb: %g*

"\nBandwidthTestb: %g"

"\nTotalNMRb %g*

"\nWinModDiff1b: %ge "\nADBb: %g"

•\nEHSb: %ge •\nAvgModDiff1b: %д*

•\nAvgModDiff2b %д"

*\nRmsNoiseLoudb: %д"

*\nMFPDb: %qm *\nRe(DistFramesb: %д"

*\nDI: %ge "VnOOG: %g\n*, count

#»tdel DATABOUNO.BE

totalframes. boundbe.begin, bound be. end,

#endif

processed. Band widthRefb.

processed. BandwidthTestb. processed.TotaANMRb.

processed.WinModDiff 1b. processed.ADBb,

processed.EHSb, processed.AvgModDiff 1b.

processed.AvgModD(ff2b.

processed.RmsNoiseLoudb. processed.MFPDb.

processed. Rel DistF ramesb.

oveRetDI. oveRetODG);

)

(

FILE #res:

res = fopen(LOGRESULT/a+e); fprintf(res.*\nFile: %s\n"

•\nframe: %d*

*\nBandwidthRefb: %g"

*\nBandwidthTestb: %g"

•\nTotalNMRb %g"

^nWinModDrfflb: %g"

ЛпАОВЬ: %g-"\nEHSb: %ge InAvgModDilMb: %g*

*\nAvgModDi1T2b %g"

4nRmsNoiseLoudb: %g"

•\nMFPDb: %g"

InRelDistFramesb %g"

•VnDI: %g"

*\nOOG: %g\n\

file test. count, processed.BandwidthRefb. processed.BandwidthTestb. processed.TotaJNMRb. processed.WinModDrfTIb. processed.ADBb. processed. EHSb. processed .AvgModDiff 1b. processed.AvgModDifT2b. processed.RmsNoiseLoudb. processed.MFPDb. processed. ReiDistF ramesb. oveRetDI. oveRetODG): fdose(res);

)

fftw_destruy_plan(plan); fclose<fpref); fclose(fptest); return 0;

)

void

ProcessFrame(signed int *ch1ref. signed int *ch2ref. int Ipref. signed int ‘cMtest signed int *ch2tesl int Iptest. int rale, int boundflag, int harm)

int к:

static int ch = 1: double Ntotaltest. Ntotalref: struct levpatadaptout lev; struct moddiffout mod; struct processing processchl. processch2; earmodelfft(ch1ref. Ipref. hann. processchl.ffterel. processchl.fftref);

earmodelfft(ch1test Iptest. hann. processchl.fTtetest, processchl .ffttest);

critbandgroupfprocesschl.fTteref. rate. hann. processchl.ppref); AddlntNoise<processch 1 .ppref);

crilbandgroup(processch1.fTtetest. rate. hann. processchl.pptest); AddlntNoise(pfocessch 1 .pptest);

fbr(k=0.k<hann/2:k+*)

processchl. fnoise[k] = module(processch1.ffteref(k))

- module(processch1 .fftetest(k));

critbandgroup(prooessch1.fnoise, rate. hann. processchl.ppnoise);

spreading(processch1.pptest processchl.E2test): spreading(processch1.ppref. processchl.E2ref): timespreading(processch1.E2test Etesttmpchl. rate, processchl.Etest); timespreading(processch1.E2ref. Ereftmpchl. rate, processchl.Eref):

threshold(processch1.Eref. processch 1 .Mref);

modulation(processch1.E2tesL rate. &mod>ntestch1. processchl.Modtest); modulation(processch1.E2ref. rate, ftmodinrefchl. processchl .ModreO;

// Data boundary rf(boundflag) {

static int countboundary = 1;

static double RelDistFramesb = 0. nmrtmp = 0;

bandwidth(processch1.fftlest processchl.fftref, hann.

&bandwidthch1);

processed. BandwidthRefb = bandwidthchl .Bar>dw»dthRefb; processed.BandwidthTestb = bandwidthchl. Band wkJthTestb;

processed .TotaINMRb = rvnr(processch 1 .ppnoise, processchl.Mref.

& nmrtmp. countboundary):

processed. RelDistFramesb = reldistframes{processch 1 .ppnoise.

processchl.Mref.

&ReJDistFramesb.

countboundary);

countboundary**;

U Data boundary ♦ Energy threshold if(energyth{ch1test chtref. hann)) ( static int countenergy = 1; static double EHStmp = 0;

processed.EHSb = harmstruct(processch1.fntest.

processchl .fftref.

&EHStmp. rate. CffUmpchl. harm samples. &oountenergy);

countenergy**;

}

}

// Delayed Averaging recount > delaytime2) { static double nltmp = 0;

static int noise = 0. intemal_count = 0. kx>dcounter = 0;

mod = moddifffprocesschl.Modtest. processedI.Modrof,

(double *)&(mod«nrefch1.EtiJdotmp)): processed. Wi nMod Difl 1 b = ModOff1(mod. Amoddiffinchl.

count - delaytime2);

processed.AvgModDiff 1b = ModDrff2(mod. &moddiffincht); processed.AvgModDtff2b = ModDffT3(mod. &modd(fTinch1);

Ntotaltest = loudness(processch1.Etest);

Ntotalref = loudness(processcht .Eref);

if(Ntotaltesl >0.1 Ц Ntotalref > 0.1) { noise = 1;

mi defined(LOU0MOOO2) intemal.count = 0;

#endif

)

// Delayed Averaging ♦ loudness threshold if(noise && intemal_count <= delaytimel) {

// skip 0.05 sec (about 3 frames)

intemal_count«n>;

loudeounter**:

>

else (

lev = levpatadapt(processch1.Etest. pnocesschl.Eref, rate. &levinch1, hann);

processed.RmsNoiseLoudb = notseloudnessfprocesschl .Modtest.

processch 1 .Modref. lev, &nttmp. count - delaytime2 • loudeounter);

}

)

П

extern double CfftQ; extern ini maxk:

FILE Tp;

logvariableCCfftsx.txt". СШ. 128); fp = fopenfCfftsxmaxpos.txt*. "a**); fprinlf(fp.‘,%d\n".maxk); fclose<fp);

)•/

if(*ch2ref && *ch2test) { ch = 2;

earmodeJfft(ch2ref. Ipref. hann. processch2.ffteref. processch2.fftref):

earmodelfft(ch2tesL Iplest. hann. processch2.fftelest. processch2. fittest):

critbandgroup(processch2.ffteref, rate. hann. processch2.ppraf); AddlntNoise(processch2.ppnef):

critbandgroup(processch2.fftetest rate. hann. processch2.pptesl); AddlntNoise(processch2.pptest):

for(k=0;k<hann/2:k++)

processch2.fnoise[k] = module(proC0SSch2.fRereflk|)

• modu4e(proces&ch2.fftetest(kj):

critbandgroup(pn>cessch2.(noise, rate. hann. processch2.ppnoise);

spreading(processch2.pptest. processch2. E2test): spreading(processch2.ppnef. processch2.E2ref):

timespreading(prooessch2.E2test. Elestimpch2, rate. processch2.Etest);

timespreading(prooessch2.E2ref. Ereftmpch2. rale. processch2.Eref);

threshotd(processch2.Eref. processed. Mref);

modulation(processch2.E2test, rate. &modintestch2. pnocessch2. Modlest);

modulation(processch2.E2ref. rate. &modirve(ch2. processch2.Modref):

U Data boundary tf(bouodflag) {

stabc ml countboundary = 1:

static double RelDistFramesb = 0. nmrtmp = 0;

bandwidlh(processch2.ffttest. processch2.fftref. hann. &bandwidtbch2):

processed.BandwidthRefb ♦= bandwidthch2. BandwidthRefb: processed.BandwidthTestb ♦= bandwidthch2.BandwidthTestb: processed.BandwidthRefb /= 2.0; processed.BandwidthTestb /= 2.0:

processed.TotaINMRb ♦= nmr(processch2.ppnoise.

processch2.Mref. &nmrtmp.

countboundary):

processed.RelDistFramesb ♦= reldistframes(processch2.ppnoise.

processch2.Mref.

&Re1DistFramesb.

countboundary);

processed.TotaINMRb /= 2.0; processed.RelDistFramesb /= 2.0: countboundary**:

// Data boundary ♦ Energy threshold if(energyth{ch2test. ch2ref. hann)) ( static int countenergy = 1: static double EHStmp = 0;

prooessed.EHSb *= harmstruct(processch2.fTttest processed, fftref.

&EHStmp. rate. Cfftimpch2. harmsamples. & countenergy); prooessed.EHSb /= 2.0; counlenergy**;

)

}

// Delayed Averaging rtfoount > de(aytime2) { static double nltmp = 0;

static int noise = 0. internal_count = 0. loudoounter = 0;

mod = moddrff(processch2.Modtest. processch2.Modref.

{double *)&(modinrefch2.EtikJetmp)); processed. WinModDrff 1b *= ModDif!1(mod. &moddiffinch2.

count - delaytime2):

processed.AvgModDiff 1b ♦= ModDrff2(mod. &moddiffmch2): processed.AvgMoc)DifT2b ♦= ModDrff3(mod. &moddiffinch2); processed. WinModDrfMb /= 2.0: processed.AvgModDiff 1b/s 2.0: prooessed.AvgModDiff2b /= 2.0;

Ntotaltest = loudness(processch2.Etest);

Ntotalref = loudness(processch2.Eref);

if(N total test > 0.1 || Ntotalref > 0.1) ( noise = 1:

Hit defined (LOU DM0D02) mtemal_coont = 0;

#endit ~

)

// Delayed Averaging ♦ loudness threshold if(no<se && intemat_count <= delay time 1) { // skip 0.05 sec (about 3 frames) intemal_oount++: k>udcounter++;

else {

lev = levpatadapt(processch2.Etest. processch2.Eref, rate.

&levinch2. hann);

processed. RmsNoiseLoudb ♦= noiseloodness(processch2.Mod test.

prooessch2.Modref. lev. &nltmp. count - delaytime2 • loud counter);

processed. RmsNoiseLoudb /= 2.0;

)

)

)

{

statk: cnt ndistorcedtmp = 0;

static double PWdetmp = 0, PMtmp = 0. Qsum = 0:

if(ch == 2)

processed.ADBb = detprob(processch1.Etest. processch2.Etest. processch 1.E ref. processch2.Eref.

&Ptildetmp. &PMtmp. &Osum.

&ndistorcedtmp. hann);

else

processed.ADBb = detprob(processch1.Etest. NULL, processch I.Eref. NULL.

&Pti!detmp. &PMtmp. &Osum.

&ndistorcedtmp. hann); processed MFPDb = PMtmp:

)

Г

#ifdef LOGVARIABLE

logvariableffnetestsx.txt*. processch l.fTletesl. hann/2); logvariableffTterefsx.lxt". processchl.ffteref, hann/2): logvahablefffttestsx.txr. processchl.ffttest hann/2); logvariable(*fflrefsx.txt,a. processch Ifftref. hann/2); logvariablefEtestsx.ur. processchl.Etest baric); logvariable{*Enefsx.ur. processchl.Eref. bark); logvariablefE2t6stsx.txt'’. processch1.E2test. bark); logvariable{*E2refsx.txt,a. processch1.E2ref. bark); logvariablefpptestsx.txt", processchl.pptesL bark); logvariablefpprefsx.ur. processchl.ppref. bark); logvariableCppnotsesx.txt*. processch 1 .ppnoise, bark); logvariablefMrefsx.txt*. processchI.Mref, bark): logvariable(*Modtestsx.txr. processchI.Modtest. bark): logvariablefModrefsx.txt*. processchI.Modref. bark):

logvariableffftetestdx.txr. processed, fftetest hann/2): logvariablefTfterefdx.txr. processch2.ffteref. hann/2); logvariablefffttestdx.bd". processch2.fTttest. hann/2);

togvanableCfftrefdx.ur. processch2.fftref. hann/2): logvariableCEtestdx.ur. processch2.EtesL baric); togvanablefErefdx.txr. processch2.Eref. bark); togvariabte("E2tesldx.lxr, processch2.E2test. bark); k>gvanabl6CE2refdx.txr. processch2.E2ref, bark);

togvariablefpptestdx.ur. prooessch2.pp(esU bark); k>gvariable("pprefdx.txt’. processch2.pprof. bark); logvariablefppnoisedx.txt*. processch2.ppnoise, bark); togvariableCMrefdx.txt*. processch2.Mref. bark); togvariablefModtestdx.txf. processch2.Modtest, bark); logvariablef Modrefdx.txt*. processch2.Modref. bark); tfendif 7

Г{

extern double CffRQ: extern int maxk;

FILE -fp;

logvariable(Xfftdx.ur. Cfft, 128); fp = fopen(*Cfftdxmaxpos.txr. "a*’); fpnntf(fp.,'%d\n*.maxk): fdose(fp);

}V

return;

}

void

fatalerr(char ‘ pattern....) Г Error handling routine V

{

va Jist ap;

va_start(ap. pattern);

fphntf(stderr.*PEAQ-"); vfprintf(stderr.pattem.ap): fpnntf(stderr.* (exit forced ).Vn");

va_end(ap);

ехЙ<-1);

}

flfdef DEBUG void

debog(char * pattern,...) t* Debug handling routine V

{

FILE ‘log; va Jist ap;

va_start(ap. pattern);

log = fopen(LOGFILE.*a+"); vfphntf(log.pattem.ap);

va_end(ap);

fdose(log);

return;

}

#endif

#ifdef LOGVARIABLE void

k>gvariable(const char filename, double *var, int len)

{

FILE 'fp; int к;

ftifdef LOCAL LFRAMES

fp = fopen(filename.*a+"}:

tteise

fp = fopen(filename.*W): tfendif

for(k=0;k<len;k++) fprintf (fp,"%gln'\var(k));

fclose(fp);

return;

)

flendif

void

usage(char * name) Г Print usage V

i

fprintf(stderr, "PEAO Algorithm. Giuseppe Gottardi 'oveRef* *<>\n\n*);

fprinlf(stderr, "usage: %s <option>\n". name); fprintf(stderr, " -r reffile[:lp] (Ip default = 92)\n*

" -t lestfile|:lp) (Ip default = 92)\n"

" -h print this helpNn");

exit (0);

)

Файл: bandwidth.h

^define ZEROTHRESHOLD 921 ^define BwMAX 546

struct bandwidthout {

double sum Band wKJthRefb; int oountnef;

double sum Band WKJlhTestb; int oounttesL double BandvridlhRefb; double BandwxJthTestb;

):

/' Function prototypes V

int bandwidth (double double ". inL struct bandwidthout *); /' Prototypes end V

Файл: bandwidth.c

include <std!4).h> include <math.h> include <common.h> include <bandwidth.h>

int

bandwidth(double 'fittest, double 'fflref. int harm, struct bandwidthout 'out)

{

int k. BwRef = 0. BwTest = 0; double FlevtesL Flevref: double ZeroThreshold:

ZeroThreshold = 20.0 * tog10(<double)mtest(ZEROTHRESHOLD|):

for(k=ZEROTHRESHOLD:k<hann/2;k*+) {

F levies! = 20.0 a log10((doubie)fRtest(k|);

rf(Flevtest > ZeroThreshdd)

Zero Threshold = Flevtest:

}

for(k=ZEROTH RESHOLD-1 :k>=0:k~) {

Flevref = 20.0 * log10((doubte)fflrBflk]);

HfFlevref >= 10.0+ZeroThreshold) {

BwRef = к ♦ 1. break:

)

>

for(k= BwRef-1 ;k>=0;k~) {

Flevtest = 20.0 4 tog10((double)m!estlk)):

rf{ Flevtest >= 5.0*Ze<o Threshold) {

BwTest = к ♦ 1: break:

)

}

rf(BwRef > BwMAX) {

out->sumBandwidthRefb ♦= {double )BwRef; out->countreK^:

}

rf( BwTest > BwMAX) {

out->sumBandwidthTestb ♦= (docibfe)BwTest out->counttest+*:

}

rf(out->countref == 0)

out->BandwidthRefb = 0: else

out->BandwidthRefb = out->sum8andwidthRefb/(double)out->cotjntrBf:

rf(out->counttest 0)

out->BandwidthTestb = 0: else

out->BandwidthTestb = out->sumBandwidthTesthf(double)ou1->countlest: return 0:

}

Файл: boundary.h ^define BOUNDWIN 5 tfdefine BOUNOLIMIT 200

struct boundaryflag { int begin: int end:

>:

Г Function prototypes 7

int boundary(signed int \ signed int *. signed int \ signed int *. int): Г Prototypes end V

Файл: boundary.c

include <stdlib.h>

^include <math.h>

^include <common.h>

^include <boundary.h>

int

boundary(signed int *ch1ref. signed int ‘chttesL signed int *ch2ref. signed int *ch2test. int hann)

{

ев

ini к. i, sum;

int ch 11 = 0. ch1r = 0. ch2l = 0. ch2r = 0;

fortk=0;k<hann-BOUNDWlNM:k<>*) { if(!ch1t) { sum = 0;

for(i=0;i<BOUNDWIN;i*+) sum ♦= abs(ch1test(k+ij); if(sum > BOUNDLIMIT) ch11 = 1;

)

if(!ch1r){ sum = 0;

for(i=0;i<BOUNDWI N; i* ♦) sum ♦= abs(ch1reflk+f]): rf(sum > BOUNDLIMIT) ditr= 1:

}

if(ch1( || ch1r)0 || or && return 1:

)

if(ch2test == NULL && ch2ref == NULL) return 0:

lor (k=0;k<hann-BOUN DWIN+ 1 ;k*+) { if(!ch2l) { sum = 0;

for(i=0;i<BOUNDWIN;i~) sum ♦= abs(ch2test{k+i]): if(sum > BOUNDLIMIT) cb2t = 1;

>

rf(!ch2r) { sum = 0;

for(i=0;t<BOUNDWIN:i**) sum ♦« abs(ch2ref[k+i)): if(sum > BOUNDLIMIT) ch2r = 1.

>

if((cti1t || cti2t) || (chlr || c*2r)) //1| or && return 1;

return 0;

)

Файл: critbandgroup.h /• Function prototypes V int critbandgroup(double *. int. int. double '); int AddlntNoise(double *);

/• Prototypes end 7

Файл: critbandgroup.c

#mdude <sldWb.b> include <math.h> include <common.K> include <crHbandgroup.h>

extern double *fL. 7C. *fU; extern int bark:

int

critbandgroup(double #ffte. int rate, int hann, double *pe)

{

double tres; int i. k;

fres = (double )rate/hann;

for(i=0:i<bark;i*+){

pe{i]=0:

for(k=0:k<hanrV2;k**){ rt(((doubie>(k-0.5)*fres) >= fL(i]

&& <(doubleXk«0.5)*fres <= fU[i]))

pelij ♦= p(me(k). 2.0):

else

if(((doubteXk-0.5)*fnes) < fL[i]

&& <(double)(k*0.5)'fres > RJ[i])) pe(i] ♦= p(ffte(k], 2.0)'(fU[il-IL(i)yfres; else

if« (doubleXk-0.5)%fnes) < fL(i]

&& {(double)(k*0.5)*fres > fL(i]))

pe(i] ♦= p(ffte[k], 2.0)'(double)((k*0.5) •fres-fLfi|yTres;

else

if(((doubteXk-0.5)*fres) < fU[t]

&& ((double)(k+0.5)*fres > ajfi])) pe(i] ♦= p(ffte(k]. 2.0)%(fU[iHdoubleXk-0.5) 'fresXfres;

}

if(pe[i] < ИЮ.О. -12.0)) pe(i] = p<10.0.-12.0);

}

return 0:

}

int

Add(ntNoise(doubie *pe)

{

int k:

double Pthres: fbr(k=0;k<bark;k*+) {

Pthres = p(10.0.0.4*0.364*p(fC[ky1000.0. -0.8)); pe(k) ♦= Pthres:

}

return 0:

}

Файл: detprob.h Г Function prototypes 7

double detprob(double V double *. double *. double *. double \ double \ double *. int \ int):

Л Prototypes end V

Фекл: detprob.c

«include <stdlib.h> «include <math.h> «include <common.h> «include <detprob.h>

extern int bark:

double

detprob(do<jbte 'Etestchl, double *Etestch2. double ‘Enefchl, double *Erefch2. double 'PUIdetmp. double ‘PMtmp. double *Osum. ini ‘ndistorcedtmp. tnl hann)

{

int k;

double EUdenefchl. Etilderefch2. Etildetestchl, Etildetestch2; double L. s. e. b. a. petit. pch2, pbin, qch1, qch2. qbin. P. cO. cl, AOBb; double prod = 1.0.0 = 0.0:

for(k=0;k<bafk:k++) {

Etildetestchl = 10.0*log10<(double)Etestch1(k)):

EtikJerafchl = 10.0‘log 10((double)Erefch1(k)):

if(Etilderefch1 > Etildetestchl)

L = 0.3aEtilderefch1: else

L = 0.3*Etildetestch1:

L ♦= 0.7*Etildetestch1: if(L > 0)

s = 5.95072*p(6.39468/L, 1.71332)*9.01033*p( 10.0. -11.0) *p<L 4.0)+5.05622*p( 10.0, -6.0)*p(L. 3.0>-0.00102438 •p(L, 2.0)4).0550197* L-0.198719;

else

s = p(10.0. 30.0):

e = EtMerefchl - Etildetestchl;

if(Etilderefch1 > Etildetestchl) b = 4.0: else b = 6.0:

a = (double)p( 10.0. Iog10((double)log10<(double)2.0))/bys;

pch1 = 1.0- p(10.0. -p{a‘e. b)):

qch1 = abs((int)eys; // don't touch this

pbin = pch1: qbin = qcht:

if(Elestch2 != NULL && Enefch2 != NULL) (

Ettdetestch2 = 10.0‘log10<(double)Etestch2fk)):

Etiklererch2 = 10.0*k>g10((double)Erefch2(k)):

if(Etilderefch2 > Etildetestch2)

L = 0.3*EWderefch2; else

L = 0.3*E«detestch2;

L ♦= 0.7*Etildetestch2: rf(L > 0)

s = 5.95072*p(6.394e6/L. 1.71332)^9.01033‘p( 10.0, -11.0) *p(L. 4.0)+5.05622*p(10.0. -6.0)*p(L. 3.0)

•0.00102438*p(L. 2.0)4).0550197*L-0.198719:

else

s = i.o*p(io.o. зо.о):

e = EtHderefch2 - Eti)deteslch2:

if(e > 0) b = 4.0; else

b = 6.0;

a = (double)p( 10.0, k>g10((double)log10{(double)2.0))/bys;

pch2 = 1.0 - р(10.0. -р(а*е, Ь)); qcK2 = abs((int)e)/s; // don't touch this

if(pch2 > pchl) pbin = pcK2: if(qch2 > qchl) qbin = qcK2:

)

prod '= (1.0- pbin):

Q ♦* qbin.

P = 1.0 - prod; if(P > 0.5) (

'Osum ♦= Q;

(*ndistorcedtmp>+♦;

}

rffndistorcedtmp == 0)

AOBb = 0; else

iffOsum > 0)

AOBb = log 10 ((double )*Qsum / (‘ndistorcedtmp)): else

AOBb = -0.5;

cO = p(0.9. harW(2.0‘ 1024.0)):

«if !denned<C1)

c1 = p(0.99. hann/(2.0*1024.0));

«else c1 * Cl;

«endif

•Ptildelmp = (1.0 - c0)*P ♦ (‘PtHdetmp)’c0: K(‘Ptikietmp > CPMtmp)'c1)

•PMtmp = *Pbldetmp: else

‘PMtrnp = (*PMtmp)"c1: return AOBb:

}

Файл: earmodelfft.h

«define NORM 11361.301063573899

«define FREQADAP 23.4375 // for 48 kHz

Л Function prototypes 7

int earmodeim(signed int *. int. int, double *. double *); Г Prototypes end V

Файл: earmodelfft.c

«include <stdlib.h>

«include <math.h>

«include <fftw.h>

«include <common.h>

«include <earmodelff1.h>

extern double hanowmdowf J; extern fftw_pian plan;

int

earmodelfft(signed int *cb, ant Ip. int hann, double *ffte, double *absffl)

int k:

double w. fac:


{

fftw_complex injHANNJ. oul|HANN);

Гас = p<10.0. Ip/20.0)/NORM:

foc(k=0;k<hann;k++) {

in(k].re = hannwindow[k] * (double )ch[k); infkj.im = 0;

)

fftw_one(pian. in. out);

foc(k=0;k<hann/2;k*«-){

oul[k].re *= (double )(fac/hann): out[k].im *= (double Xfac/bann);

absfftyk] s sqrt((doubie)(p(out[k].re. 2.0) ♦ p(out(k].tm. 2.0)));

w = -0.6*3.64'p{k • FREQADAP/1000.0. -0.0) ♦ 6.5'exp((double)-0.6*p(k * FREQADAP/1000.0 - 3.3. 2.0)) -0.001 *p(k * FREQAOAP/1000.0. 3.6):

me[k] = absfft[k]*p(10.0, w/20.0);

)

return 0;

)

Файл: energyth.h //define ENERGY LIMIT 8000

/* Function prototypes V

int energyth(signed int \ signed int \ int);

/• Prototypes end 7

Файл: energyth.c

//include <std)fc.b>

//include <math.h>

//include <common.b>

//include <energyth.h>

int

energyth(signed int Most, signed int *ref, int hann)

{

int k:

double sum: sum = 0;

for(k=0;k<hann/2;k*+) { sum ♦= p(test(hann/2 ♦ k|, 2.0): cf(sum > ENERGYUMIT) return 1;

)

sum = 0:

foc(k=0;k<hann/2;M+) { sum ♦= p(retyhann/2 ♦ k). 2.0); if(sum > ENERGYUMIT) return 1;

)

return 0;

)

Файл: getframe.h //define LP 92

Г Function prototypes V

signed mt GetFrameValue(FILE *. int);

int GetMonoFrame(FlLE *. signed int \ int, int);

int GetStereoFrame(FILE signed int *. signed int \ int. int);

int LevelPression(char *);

int Readlnt(FILE *. int);

void fataierr(char

Г Prototypes end V

Файл: getframe.c ^include <stdio.h>

^include <string.h>

^include <stdlib.h>

^include <getframe.h>

extern int ermo; signed int

GetFrameValoe(FILE *fp. int bytes)

{

int intvalue:

rf (bytes <= 0) return 0;

intvalue = Readlnt(fp. bytes); swKch(bytes) ( case 3:

rf (intvalue & 0x00800000) intvalue |= OxffOOOOOO: break, case 2:

rf (intvalue & 0x00008000) intvalue |= OxffVTOOOO; break, case 1:

rf (intvalue & 0x00000080) intvalue |= OxffTOTOO: break:

}

return (signed int) intvalue:

}

int

GetMonoFrame(FILE *fp. signed int *vect int bytes, int hann)

{

int i = 0:

rf (fp == NULL) return 0;

if (fseefc(fp, (-hanrtf2)*bytes. SEEK_CUR) == -1) fatalerr(*err: %s". strerror(errno));

while(!feo((fp) && i < hann) {

vectfi] = GetFrameValue(fp. bytes):

rf(i < hann) {

bzero(vect hann*4); fseek(fp. -i’bytes. SEEK.END): return 0;

)

Л Number of samples wrote 7 return i;

}

ini

GetSlereoFrame(FILE *fp. signed ini asx. signed int *dx. int bytes, tfit hann)

{

int i = 0. к = 0. count = 0:

if (fp== NULL) return 0;

if (fseek(fp. -hann*bytes. SEEK_CUR) == -1) fatalerrferr %s'. strerror(ermo)):

while(!feof(fp) && count < hann*2) { if(!k) {

sx[i] s GetFrameVa!ue(fp. bytes): k«1;

i~:

count**:

}

else {

dx[i) = GetFrameValue(fp. bytes):

к = 0;

count**:

>

i**;

)

if (count < hann*2) ( bzero(sx. hann*4); bzero(dx, hann’4): fseek(fp. -count'bytes. SEEK_END); return 0:

)

/* Number of samples wrote V return count:

)

int

LevelPression(char %f)

{

int Ip;

while(%f != V && *f> f**:

if(-f ==V){

Ip = atoi(f * 1); *f = VT; return Ip;

)

else

return LP:

)

Файл: harmstruct.h /• Function prototypes V

double harmstruc!(double \ double *. double int. double *. int int *); void debug(char /* Prototypes end 7

Файл: harmstruct.c include <stdl4>.h> include <math.h> include <string.h>

^include <fftw.h>

^include <common.h>

^include <harmstruct.h>

extern char 'filetest extern int count; extern fftw_ptan p)an2:

double Cfft|HANN/2J; int maxk;

double

harmstnjct(double 'ffttest double 'fftref. double *EHStmp. int rate, double *Cffttmp. int p. int *n)

{

int k. i;

double F0(HANN/2|. C[HANN/2). hannwin(HANN/2|; double num. denoma, denomb. Csum = 0; ffhv_complax in(HANN/2], out|HANN/2); double max:

bzero(Cfft В * HANN/2);

Ик=0:к<р‘2-1;к^){

rt(imreflk) || Iffttestjk]) { // skip log(0)

tfif defined<SKIPFRAME) && ! defined (ZERO)

CnH return 0;

#etif defvned(ZERO) rf(!fftrefyO) {

fftreflk) = ZERO; fcfdef DEBUG

debugfWarning (%s:%dj in Harmstructc:" efftraf[%d] is set around zero\n*.

Hletest, count, k, fftretyk]);

JtondH

)

if(!mtest[k]){

ffttest(k] = ZERO: tffdef DEBUG

debugfWarning (%s:%d] in Harmstruct.c: * *ffttest(%d] is set around zenoVT,

Bletest, count, k. ffttest(k));

Jtondif

}

F0[k] = log 10(p<fftreflk). 2.0)) - Iog10(p<ffttest(k], 2.0));

fteiSQ

rttlfftrefjk) && !ffttest[k])

F0[k] = 0; else{

ttfdef DEBUG

debugf Error |%s:%d] in Harmstruct.c:"

Tog{fffrefl%dJ = %g k>g(ffUest[%d] = %g\n", filetest, count, k. fftreflk]. k. fft1est(k]);

/Stood ff F0(k] = 0;

}

#endff

}

else

F0[k] = log 10(p(fftreflk]. 2.0)) - Iog10(p<ffttest|k]. 2.0));

}

for(»=0;i<p;i**) { num = 0;

denoma = 0; denomb = 0; for(k=0;k<p;k++) { num 4= F0(k] • F0[i+k); denoma ♦* p(F0(k]. 2.0); denomb ♦* p(F0[i*k], 2.0);

)

hannwin(i) = 0.5'sqr1((doub4e>8.0/3.0)#(1.0 - cos((double)2.0 •M_PIV(p-1.0)));

C[i] = num / (sqrt«double)denoma) * sqrt((doub4e)denomb)>;

#rt ’defined(AVG HAN N)

C(i] *= hannwin[i];

#endif

Csum ♦= C(i];

)

for(i=0;t<p;i-*»^) {

C[i] -= (double)Csum/p;

#H defined(AVGHANN)

C[iJ *= Kannwinp);

#endif infl.im = 0; injij.re = 0{i]:

)

fftw_one(ptan2. in, out);

for(k=0;k<p/2:k**){

outfkj.re *= (double )(1.0/p); out(k].im '= (double Я1 -0/p);

Cffi(k) = p(out[k].re, 2.0) ♦ p(out(k].im, 2.0);

)

#Hdef EHSMOD02 for(k=0:k<p/2;k**){

Cffttmp{k) ♦= Cfltfk):

Cfft(k) = CfR1mp(ky(*n);

)

ftendif

«if Idefined(GETMAX) i = 0+PATCH; while(l) (

if(Cmfi) >= Cm[i*1]){ while(i < p/2-1 && CfftR >= Cfft|i^1)) i++;

if(i < p/2-1) break: else {

CnH

return 0;

>

else (

while(i < p/2-1 && ОВД <= Cflt(iM])

while(i < p/2-1 && СШ[1) >= Cfft(i*1|)

if(i < p/2-1) break: else {

C«H

return 0;

)

>

}

«else i = 0:

«endif

max = 0;

for(k=i*1:k<p/2:k*+) tf(Cffl(k] > max) { max = Cfftykj; maxk = k;

)

«cfdef EHSMOD02 return max* 1000.0;

«endif

(*EHStmp) ♦= max;

return (CEHStmp)-1000.0/('n));

}

Файл: levpatadapt.h

«define T100 0.05 «define Tmin 0.008 «define M 8 // if M is odd Л

«define M1 (М-1У2 «define М2 Ml V

// if M is even «define M1 M/2 -1 «define М2 M/2

struct levpatadaptout { double EpreffBARK): double Eptest|BARK]:

}:

struct levpatadapUi { double Ptest(BARK): double PrefIBARK]; double PattCorrTest(BARK); double PattCorrReflBARK]; double Rnum(BARK); double Rdenom[BARK);

}:

Л Function prototypes 7

struct levpatadaptout levpatadapt(doubte double \ int, struct levpatadaptin *, int);

Г Prototypes end 7

Файл: levpatadapt.c «include <stdlib.h> «include <math.h> «include <common.h> «include <1evpatadapt.h>

extern int bark: extern double *fC;

struct levpatadaptout

levpatadapt(double *Etest. double *Eref. ini rate, struct levpatadaptin *tmp. int harm)

{

int k. i. mt. m2:

double T. levcorr. numlevoorr = 0. deoomlevcorr = 0. R; double pattcoeffref. pattcoefftest:

double ElreflBARK). Eltest[BARK], RtestfBARK). Rref|BARK), a(BARK); struct levpatadaptout out;

for(k=0:k<bark;k**){

T = (double )Tmin ♦ (100.0ДС(к)ПТ100 - Tmin); a(k) = exp{(doubte)-hann/(2.0'rate * T)): tmp->PtestIk) = tmp->Ptest[k)*a[k] ♦ (1.0^a[k])"Etest(k); tmp->Pref)k] = tmp->Pref)k)'a(k] ♦ (1.0-е1к))'Егеф(]; numlevcorr ♦= sqrt(lmp->Ptest(k]*tmp->Pnef[kJ); denomlevcorr ♦= tmp->Ptest(k);

levcorr = p(m*nlevcon7denomlevcorr, 2.0);

for(k=0;k<bafk;k**) { if(levcorr> 1.0) {

Elref)k] = (doubleJEreffkJ/levcorr;

EUest(k) = Etest(k);

)

else (

Ellest(k) = (double )Etest(k]* levcorr;

Elref[k] = Erefjk);

)

//Autocorrelaboo tmp->Rnum(k) *= afk); tmp->Rdenom[k] *= a[k|; tmp->Rnum(k) ♦= EJreflk]‘Eftest[k): tmp->Rdenom[k] ♦* Elrefjk)*Elref|k],

if(tmp->Rdeoom(k| == 0 && tmp->Rnum(k] 1= 0) { Rtestfk] = 0;

Rref(k] = 1.0;

>

else

if(tmp->Rdeoom[k] == 0 && tmp->Rnum(k) == 0) { //oopy from frequency band below

Rlest(k) = RtestJk-1);

Rref)k) = RrefJk-1);

>

Ш don't exist else {

Rlest(k) = 1.0;

Rreflk] = 1.0;

>

>

else (

R = tmp->Rnum(k) t tmp>>Rdenom(k]; if(R >= 1.0) (

Rlest(k) = 1 .(VR;

Rreflk) = 1.0;

)

else {

Rlest(k) = 1.0;

Rreflk) = R;

>

)

)

for<k=0:k<bark:k**){ ml = Ml: m2 = М2: paltcoefftest = 0; pattcoeffref = 0;

if(m1 > k) ml = k;

if(m2 > bark -k -1) m2 = bark -k -1;

for(i = -m1:i <= m2:i++) { paltcoefftest ♦= Rtestjk+i]; pattcoeffref ♦= Rretyk+i):

}

tmp->PattCorrTest[k) =afk]#tmp->PattConTest(k] ♦ pattcoefftest'(1.0-a(k])/(m 1 ♦m2^ t); tmp->PattCorrReflkJ = a(kJ,tmp->PattCorrRefpt) ♦ pattcoeffref* ( 1.0-a{K) V(m 1 +012+1 >;

out.Epreffk] = Elreffk] * tmp->Pat!CorrRef[k]; out.Eptestfk] = Eftestjk] * tmp->PattCorrTest(k];

return out;

>

Файл: loudness.h «define CONST 1.07664

Л Function prototypes 7 double k>udness(double '); Г Prototypes end V

Файл: toudness.c

«include <stdlib.h>

«include <math.h>

«include <common.h>

«include <loudness.h>

extern double *fC; extern int bark:

double

foodness(double *E)

{

int k:

double Ntot = 0; double s. N. Ethres;

for(k=0;k<bark:k**){

s = p<10.0. (-2.0-2.05*atan((double)fC(k)/4000.0) - 0.75 4atan((doub*e )p<fqk]/1600.0. 2.0»y 10.0);

Ethres = p(10.0.0.364*P(fC(kJ/1000.0. -0.8));

N = (double)CONST'p(Ethres/(s* 10000.0), 0.23) •(p(1.0-s*s*E(kyEtbres. 0.23) -1.0); rf(N > 0)

Ntot ♦= N;

}

Ntot *= (double)24.0/bark; return Ntot:

}

Файл: moddrff.h

^define L 4

struct modddfin { double win: int Lcount; double modtmp: double mod(L]; double num2: double denom2: double num3; double denom3:

struct modddfout { double ModDiffl; double ModDrff2: double TempWt:

):

Г Function prototypes '/

struct modddfout moddiff(double \ double \ double *): double ModDiffl (struct modddfout. struct moddrffin *. int): double ModDvff2(struct modddfout. struct moddrffin *); double ModDiff3(struct modddfout. struct modddfin *);

/• Prototypes end V

Файл: moddrff.c #indude <sld!i).K> include <asserth>

#indude <matb.h>

^include <common.h>

#indude <moddiff.h>

extern double *fC; extern int baft;

struct modddfout

moddifT(doubte *Modtest double 'Modref. double ‘Eldderef)

{

int k;

struct modddfout out; double Pthnes;

out.ModDiffl = 0; out.ModDiff2 = 0; out.TempWt = 0;

for(k=0;k<bark;k++) {

// WinModDifftB && AvgModDifftB

oul.ModDiffl ♦= module(Modtest(k] - Modrefjk)y(1.0 ♦ Modreffk]):

//AvgModDiff2B

if(Modtest[k] > ModrefJX])

out.ModDdf2 ♦= moduie(Modtest{k] - Modref|k])

/<0.01 ♦ ModrefJkJ);

else

out.ModDd!2 ♦= 0.1 *module(Modtest(k] - Modrefjk])

/(0.01 * Modref[kj):

Plhres = p(10.0. 0.4*0.364'p(fC[k)/1000.0, -0.8»: out.TempWt ♦= Etilderef[ky(Etildereflk] ♦ p(Pthres. 0.3)' 100.0):

)

out.ModDiffl *= (double)100.0/bark:

out.ModDrff2 '= (doub*e)100.0/bark:

return out;

}

double

ModDrff1( struct moddrffout in. struct moddiffin 'intmp, int n)

{

int i;

intmp->mod[intmp->Looont] = in.ModOffl; intmp->Lcount++; rf(intmp->Lcount == L) intmp*>Lcount = 0:

if(n < L) return 0;

intmp->modtmp = 0; fbr(i=0;i<L;H-*)

intmp>>modtmp sqrt((double)intmp->mod[i]): intmp->modtmp /= (double)L; intmp->w»n ♦= p(intmp->modtmp. 4.0); return sqrt((double)intmp>>win/(doubteXn4.+1.0));

}

double

ModDifF2< struct moddrffout in. struct moddiffin 'intmp)

{

intmp->num2 ♦= m.ModDifft * in.TempWt; intmp->denom2 ♦= in.TempWt;

return (intmp->num2/intmp->denom2);

}

double

ModDiff3(struct moddrffout in. struct moddiffin 'intmp)

{

intmp->num3 ♦= in.ModDiff2 • in.TempWt; intmp-> den om3 ♦= in.TempWt;

return (intmp->num3/inlmp->denom3);

}

Файл: modulations «define T100 0.05 «define Tmtn 0.008

struct modulationin { double Eder1mp(BARKJ; double E2tmp{BARK); double Etildetmp(BARK);

}:

Л Function prototypes У

int modulation(doubie *. int. struct modulationin '. double •); Г Prototypes end V

Файл: modulations

«include <stdlib.h> «include <assert.h> «include <math.h> «include < common.h> «include <modulation.h>

extern int bark;

extern double *fC: int

modulation(doubte *E2. int rate, struct modulationin *in. double 'Mod)

i

int k;

double T. a; for(k=0;k<bark;k**) {

T = (double)Tmin ♦ (double)(100rtC[k|)'(double)<T100- Tmin); a = exp((double)- HAN N/(2 * rate * T));

irv>Edert/np(k] = in->Eder1mp(k]'a+(1-a)*(double)(rate/(HANN/2)) •module(p(E2|k). 0.3) - p(in->E2tmp{k), 0.3»; irv>E2tmp(k) = E2(k|;

irv>EUdetmp{k] = a*irv>EtifcJetmp{k]+(1-a)*p(E2[k], 0.3):

Mod[k] = in->Edertmp[ky(1 ♦ (in->EWdelmp(k]/0.3));

)

return 0;

)

Файл: neural.h

Mdefine sig(x) (doubleК 1.0/( 1.0 ♦ exp<(doubleHx))))

^define I 11

Mdefine J 3

struct outframes { double WinModDifMb; double AvgModDifMb; double AvgModDifT2b; double RmsNoiseLoudb; double BandwkJthRefb; double BandwidthTestb: double Total NMRb; double RelDistFramesb: double ADBb: double MFPDb; double EHSb:

):

struct out { double ODG; double Dl:

);

/• Function prototypes V

struct out neural(struct outframes processed);

/* Prototypes end 7

Файл: neural.c ftndude <sldli).h> include <matfi.h> ftndude <co<nmon.b> include <neural.h>

double amin(11] = {393.916656. 361.965332. -24.045116. 1.110661. -0.206623.

0.074318. 1.113683. 0.950345. 0.029985. 0.000101. 0.0): double amax{11] = {921.0.681.131226.16.212030. 107.137772. 2.886017.

13.933351. 63.257874. 1145.018555, 14.819740. 1.0, 1.0): double wx[12)[3] = {{-0.502657.0.436333.1.219602).

(4.307481. 3.246017. 1.123743).

(4.984241. -2.211189. -0.192096).

(0.051056. -1.762424.4.331315).

{2.321580. 1.789971, -0.754560),

{-5.303901.-3.452257. -10.814982}.

{2.730991.-6.111805. 1.519223}.

{0.624950. -1.331523. -5.955151}.

{3.102889.0.871260. -5.922878}.

{-1.051468. -0.939882. -0.142913}.

{-1.804679. -0.503610. -0.620456}.

{-2.518254, 0.654841, -2.207228}}; double wy(4] = {-3.817048. 4.107138. 4.629582. -0.307594}: double bmin = -3.98; double bmax = 0.22:

struct out

neuralfstruct outframes processed)

{

int j. i;

struct out oveRet: double suml. sum2: double x{ 11);

x(0] = processed.BarxJwkJthRefb:

x|1 j = p recessed. BandwxJthTestb;

x{2] = processed.TotaINMRb:

x|3] = processed. WmModDiff 1b;

x{4] = processed ADBb:

x|5] = processed. EHSb;

ф) = processed-AvgModDifl 1b;

x(7] = processed-AvgModDiff2b;

x(8) = processed.RmsNoiseLoodb.

x{9] = processed. MFPDb:

x(10] = processed. RelDistFramesb;

It gcodcla.wav Гх(0] = 834.117; x(1) = 647.095: x|2] = -14.6048: x|3) = 6.89483: x{4] = 0.432969; x|5] = 0.503605; x(6] = 7.14863: x[7) = 24.9353; x|8] = 0.124738; x|9) = 0.968876;

x(10] = 0.0485208; H cos ми tutto okV

II ccodsax.wav Гх[0) = 853.375; x|1) = 645.444; x|2) = -7.94882; x(3] = 11.4108; x(4| = 1.41971; x(5) * 0.491164; x(6] = 12.6383: x{7)= 44.7187: x(8) = 0.21807: x{9] = 1.15^/0.675505; x{10] * 0.556215:'/

sum2 = 0: for(j=0;j<J:j4+) { suml = 0; for(r=0;i<l:i++)

suml ♦= wx{i)(j]‘((x[t] - amin[i]V(amaxft] - amin[i])); sum2 ♦= wy{j]*sig(wx(ISj] ♦ suml);

}

oveRet.DI = wy(J] ♦ sum2;

oveRet.OOG = bruin ♦ (bmax - bmm)*s*g(oveRet.DI): return oveRet:

)

Файл: nmr.h Г Function prototypes V double nmr{doub4e *. double \ double \ int); /* Prototypes end 7

Файл: nmr.c

include <stdl4).h> ftndude <math.h> include <common.h> include <nmr.h>

extern int bade

double

nmr(double *Pnoise. double *M. double *nmrtmp. int n)

{

int k:

double sum = 0:

for(k=0;k<bark;k++)

sum ♦= Pnoise{k]/M[k]:

sum *= (double) 1 .Qfbark:

•nmrtmp ♦* sum:

return (10.0*log10((*nmrtmp)/n));

)

Файл: noiseloudness.h ^define THRESFACO 0.15 ^define SO 0.5 define E0 1.0 define ALPHA 1.5

Г Function prototypes V

double noiseloudness(double double *. struct levpatadaptout.

double \ int);

Г Prototypes end 7

Файл: noiseloudness.c

ftndude <stdli).h> include <matb.h> ftnclude <common.h> include <levpatadapt.h> include <noiseloudness.h>

extern int baft; extern double *(C;

double

noiseloudness(doub!e *Modtest. double 'Modref. struct levpatadaptout lev. double “nltmp, int n)

{

int k;

double Pthres. stest. sref. beta, num, denom: double nl s 0:


for(k=0:k<bark:k**)(

Pthres = р(10.0.0.4*0.364*p(fC(ky1000.0. -0.8)); stest = (double)THRESFACO* Modlest[k] ♦ SO: sref = (double )THRESFACO*Modreflk] ♦ SO: rf(lev.Eptest[k] == 0 && lev.Epnsf)k] == 0) beta = 1.0; else

if{tev.Epreflk] == 0) beta = 0; else

beta = exp((doubte)-ALPHA*(lev.Eptest[k] - lev.Epreflk]) Aev.Epref[kJ):

num = stest*lev.Eptest(k] - srePlev.Epreffk); denom = Pthres ♦ sfePlev.Epref[k|*beta: rftnum < 0) num = 0;

nl ♦* p(Pthres/(EO*stest). 0.23)‘(p(1.0 ♦ num/denom. 0.23) -1.0);

}

nl *= (double)24.a/bark; rf(rrf < 0) nl = 0;

*nltmp ♦= p(nl. 2.0); return sqrt((double)*nttmp/n);

}

Файл: reldistframes.h Г Function prototypes V

double reldistframes(double *. double *. double *. int); Л Prototypes end V

Файл: reldistframes.c

«include <stdlib.h>

«include <math.h>

«include <common.h>

«include <refdistframes.h>

extern int bark:

double

rekjistframes(double *Pnoise. double double *reldisttmp. int n)

{

int k:

for(k=0:k<bark:k**) {

rf< 10.0* log 10{(doubJe)Pnotse(kyW|k)) >= 1.5) (

*rekJisttmp = *reldisttmp ♦ 1: break:

)

}

return ((double)*reldistimpta);

}

Файл: spreading.h «ifdef ADVANCED «define dz 0.5 «else

«define dz 0.25 «endif

/* Function prototypes V

int spreadingfdouble \ double ’):

/• Prototypes end V

Файл: spreadIng.c

include <sldli).h> include <math.h> include <common.h> include <spreading.h>

extern double *fC; extern int bade

int

spreading(doubte *pp. double *e2)

{

int k. j. u: double L;

double denom. suml. surn2. Eline. Su. SI = 27.0;

for(k=0:k<bark;k++) { suml =0; sum2 = 0;

// Eline

for(j=0;j<bark;j***O {

L= 10.0‘log10((doubte)pp{j]);

Su = -24.0-230.0dCD)^0.2'L;

Eline = p( 10.0. L/10.0); if(k<j)

Eline *= p(10.0. -dz#(j-k)‘Sl/10.0): else

Eline *= p(10.0. dz#(k-j)*Su/10.0):

denom = 0; for{u=0;u<j;u^*O

denom ♦= p(10.0. -dz*(j-u)*SV10.0); for(u=j;u<bark:u*+)

denom ♦= p(10.0. dz*(u-j)'Su/10.0):

Eline /= denom; suml ♦= p{Eltne. 0.4);

)

//Eline (tHde) for(j=0:j<bark:j****) {

Su = -24.0-230.0/fCDl: // L = 0 if(k<j>

Ebne = p(10.0. -dz'(j-k)'SV10.0); else

Eline = p(10.0. dz'(k-j)*Su/10.0):

denom = 0; for{u=0;u<j;u**O

denom ♦= p(10.0. -dz'(j-u)‘SI/10.0): for(u=j;u<bark:u*+)

denom ♦= p(10.0. dz*(u-j)*<-24.0-230.0/fC{fl)/10.0);

Eline /= denom; sum2 ♦= p( Eline. 0.4);

)

sum2 = p(sum2. 1.0/0.4); suml = p(sum1, 1.0/0.4);

e2(k] = sum1/sum2;

)

return 0;

)

Файл: threshold.h «ifdef ADVANCED «define d 2 0.5 «else

«define d z 0.25 tfendif

Г Function prototypes 7

int thresho!d(doub4e V double *);

Г Prototypes end V

Файл: threshold.c «include <stdlib.h>

«include <math.h>

«include <common.h>

«include <throshold.h>

extern int bark; int

lhreshold(doubte *E. double *M)

{

int k:

double m;

for(k=0:k<bark:k**) { it((m = к ’ dz) <= 12) m = 3.0: else

m *= 0.25;

M[k] = E[k)/p(10, m/10);

}

return 0:

}

Файл: timespreading.h Л Function prototypes 7

int timespreading(double *. double int double *); Г Prototypes end 7

Файл: timespreading.c «include <stdlib.h>

«include <math.h>

«include <common.h>

«include <timespreading.h>

«define T100 0.03 «define Tmi/i 0.008

extern int bark: extern double #fC;

int

timespreading(double *E2. double *Etmp. int rate, double *E)

{

int k:

double a. T; fbr(k=0:k<bark:k++) {

T = (double)Tmin ♦ (doub»e)(100.QrtC(k])*(doubleXT100- Trrvn); a = exp((doub!e)-HANN/(double)fr2.0*rate));

Etmpfk] = Е1тр[к)*а ♦ <V0-a)*E2[k];

if(Etmp{k] >= E2JX]) E(kJ = Etmp[k];

^ ВД = E2|k);

)

return 0;

)

Файл: wavedump.h

Г Function prototypes V

int HeaderOump(FiLE \ const char*);

int Reading FILE \ int);

int SampieRate<FILE *);

int BitForSample(FtLE *);

int NumO(Chan(FtLE');

int FindData(RLE *):

void fatalerr(char

/• Prototypes end V

Файл: wavedump.c

include <stdio.h> ftndude <string.h> ftndude <stdli) h> ftndude <wavedump.h>

extern int ermo;

int

HeaderDump(FILE *fp. const char ‘string)

{

char buff[7); int k. offset = 0;

while (ffeof(fp)) {

if(!fread(buff. 7, 1, fp)) fatalerrferr. error in WaveHeader*): offset ♦= 7; for(k=0;k<4;k<M>)

if (!stmcmp<(char *Kbuff ♦ k), string. 4)) { fseek(fp. k-3. SEEK_CUR): offset ♦= k-3: return offset;

>

fseek(fp. -3. SEEK.CUR); offset -3:

)

return -1:

)

int

SampleRate(FILE *fp)

i

int rate, offset;

if ((offset = HeaderOump(fp.’>fmt")) == -1) return -1;

if (fseek(fp. 8. SEEK.CUR) == -1) fataterr("err %s". strerror(ermo)):

rate = Readlnt(fp,4); fseek(fp. -8 - offset. SEEK.CUR):

return rate;

>

int

BrtForSampto(FILE *fp)

{

int bit, offset:

if ((offset = HeaderDump(fp ,"fmt")) == -1) return -1:

if (fseek(fp. 18. SEEK_CUR) = -1) fatalerrCerr: %s". strerrorfermo));

bit = Readlnt(fp.2):

fseek(fp. -18 - offset SEEK_CUR);

return bit

}

int

NuroOfChan(FILE %fp)

{

int chan, offset:

if ((offset = HeaderDump(fp."fmt *)) == -1) return -1:

if (fseefcffp. 6. SEEK_CUR) == -1) falalerrferr: %s". strerrorterrno));

chan = Readlnt(fp,2): fseek(fp. -6 - offset. SEEK.CUR):

return chan:

}

int

FindData(FILE *fp)

{

int offset

rf (fp == NULL) return -1;

if ((offset = HeaderDump(fp,*data*)) == -1) return -1:

if (fseefc(fp. 4 ♦ offset SEEK_CUR) == -1) fatalerrferr: %s". strerrorfermo));

return 1:

}

#if defined(LITTLE) && !defined(BIG) int

Readlnt(FILE *fp. int size)

{

int I:

unsigned char c;

if (size <= 0) return 0;

c = fgetc(fp):

Is ((int) c) & 255:

I |s (Readlnt(fp, size-1)« 8);

return I;

}

tfetif defined(BIG) && !defined(LITTLE) int

Readlnt(FILE fp. int size)

{

irtt I;

if (size <= 0) return О;

I = (Readlnt(fp, size-1)« 8);

11= <(int) rgetc(fp)) & 255:

return I;

)

Pend if

Б.Э Листинг программы расчета метрики PSNR на языке Matlab function PSNR = calcPSNR(X.Y)

% чем больше значение PNSR. тем более похожи сигналы m = max(X); d = var(X-Y);

R = m/sqrt(d);

PSNR = 20* log10(R): end

Б.4 Листинг программы расчета метрики PSNR на языке С Pindude <math.h>

double var(doubte‘ art. irrt size)

{

if(!arr (I !size) return 0.0:

double v = 0.0: double avg = 0.0;

for(int i = 0; i < size: ♦♦i) avg*= arrfij;

avg/- size:

for(int i = 0; i < size: ♦♦i)

{

v*= (anti] - avg)' (arrfi) - avg):

)

return v i (size -1);

)

double catcPSNRfdouble* X. int sizeX. double* Y, int sizeY)

{

if(!X ||!sizeX |( !Y || IsceY || (sizeX != sizeY)) return 0.0:

double D[sizeX]; double maxX = X(0]; foc(int i = 0; i < sizeX:

{

i1(X(i] > maxX) maxX = X(i);

Df.] = X(i]-Yr«]:

)

double v = var(D, sizeX):

if(v == 0) return 0.0:

return 20 * log10(maxX / sqrt(v));

)

Б.5 Листинг программы расчета метрики «Коэффициент различия форм сигналов» на языке Matlab

function vat = calcMeasureBasedOnSingalsForms(X.Y)

% чем меньше реэугыирующее значение, тем более похожи сигналы

Xs Х(:,1);

Y=Y(:.t);

dX=X(2:end)-X(1:end-1); dY=Y(2:end) - Y(1:end-1):

val = var( dX-dY);

end

Б.6 Листинг программы расчета метрики «Коэффициент различия форм сигналов» на языке С ^include <math.h>

double var(double* arr. int size)

{

if(!arr || Isize) return 0.0;

double v = 0.0; double avg = 0.0;

for(»nt i = 0: i < size: ♦+!) avg+= arrfi);

size:

for(int I = 0: i < size:

{

v*= (arr(i] - avg) • (arr(i) - avg);

}

return v / (size - 1);

}

double calcMeasureBasedOnSingalsForms(doubte* X. int sizeX. double* Y. int sizeY )

{

ff(lX || !sizeX || !Y || !sizeY || (sizeX != sizeY)) return 0.0;

double dXlsizeX -1]; double dY(stzeX -1]: double D(sizeX -1];

for(int i = 1: i < sizeX; ++i)

{

dX[i -1| = Xfi] - Xft - 1); dY[i -1| = Y[iJ - Y£i - t);

D[i -1] = dXft - 1] - dY(i -1);

}

return var(D. sizeX - 1);

}

УДК 621.398:006.354    ОКС 13.320    П77    ОКП 43 7200

Ключевые слова: системы охранные телевизионные, аудиоданные, аудио-компрессия, аудиокодер, аудиодекодер, кодек аудиоданных

Редактор Н.А Аргунова Технический редактор В.Н. Прусакова Корректор В.И. Варонцова

Компьютерная верстка ИЛ. Налейхинои. Л.А Круговой

Сдано в набор 19 03.2015. Подписано о печать 13.10.2015.    Формат 60*84'Л.    Гарнитура А риал.

Уел. печ л 10,70. Уч.*мад. л. 7.50. Тираж 32 эка. За*. 3277.

Издано и отпечатано во ФГУП «СТАНДАРТИНФОРМ». 123995 Моссао. Гранатный пер.. 4.