OPUS kodek

No Comments

OPUS Audio kodek

Opus je audio kodek navržený pro širokou škálu aplikací. Např. Voice over IP, videokonference, chat v rámci her, ale i k živému přenosu hudebních vystoupení. Je schopen přecházet od úzkopásmového mono hlasového projevu s nízkým datovým tokem (od 6kbit/s) k velmi vysoce kvalitnímu stereo záznamu hudby (až 510kbit/s). Opus využívá jak Lineární Predikci (LP), tak i Modifikovanou Diskrétní Cosinovou Transformaci (MDCT) k dosažení dobré komprese jak mluveného projevu, tak hudebního záznamu.

Hlavní myšlenka využítí dvou vrstev stojí na využítí Lineární Predikce k záznamu hlasového projevu, protože má větší efektivitu nez Modifikovaná Diskrétní Cosinová Trasformace, která je naopak učinější na záznam hudby a vyšších frekvencí hlasového projevu.

Kodek OPUS obecně

Opus kodek je schopen přecházet od 6kbit/s narrowband mono hlasového projevu k 510kbit/s fullband stereo hudbě s algoritmickým zpožděním mezi 5 ms a 65.2 ms. V libovolném okamžiku může být použita LP vrstva, MDCT vrstva nebo obě současně. Opus je schopen bez problémů přepínat mezi všemi způsoby kódování, což přináší velkou flexibilitu mezi proměnlivým kódovaným obsahem a proměnlivými síťovými podmínkami bez nutnosti znovu navazovat relaci.

Kodek umožňuje proměnlivé vstupní a výstupní šířky pásem, které jsou definovány následující tabulkou:

   +----------------------+-----------------+-------------------------+
   | Zkratka              | Šířka pásma     | Vzorkovací frekvence    |
   +----------------------+-----------------+-------------------------+
   | NB (narrowband)      |           4 kHz |                   8 kHz |
   |                      |                 |                         |
   | MB (medium-band)     |           6 kHz |                  12 kHz |
   |                      |                 |                         |
   | WB (wideband)        |           8 kHz |                  16 kHz |
   |                      |                 |                         |
   | SWB (super-wideband) |          12 kHz |                  24 kHz |
   |                      |                 |                         |
   | FB (fullband)        |      20 kHz (*) |                  48 kHz |
   +----------------------+-----------------+-------------------------+

(*) Ačkoli vzorkovací teorém dovoluje vzorkovat šírku pásma až do poloviční frekvence vzorkovací frekvence, Opus nekóduje zvuk nad 20kHz, protože 20kHz je obecně uznávaná hranice slyšitelnosti lidským sluchem.

LP vrstva

LP vrstva je založena na kodeku SILK, který podporuje NB, MB a WB audio a rámce od 10 ms do 60 ms. SILK vyžaduje navíc 5 ms načtení dat dopředu pro odhad tvarování šumu. Další malé zpoždění (do 1.5 ms) je vyžadováno převod vzorkovací frekvence. Jako mnoho dalších moderních kodeků je i SILK navržen pro proměnlivý datový tok (VBR) ačkoli encoder je schopen produkovat konstatní datový tok (CBR).

Verze SILK kodeku použitého v rámci Opusu je mírně modifikovaná a není kompatibilní se stand-alone SILK kodekem vyvinutým firmou Skype.

MDCT vrstva

MDCT vrstva je založena na Constrained-Energy Lapped Transform (CELT) kodeku, který podporuje NB, WB, SWB a FB audio a rámce od 2.5 ms do 20 ms. CELT vyžaduje 2.5 ms načtení dat dopředu pro překryv MDCT oken. CELT kodek je ze své podstaty navržen pro CBR kódování, ale narozdíl od mnoha CBR kodeků není omezen na předem stanovené rozsahy. CELT vnitřně rozděluje bitovou šířku dle předem stanoveného rozsahu. Enkodér je schopen produkovat VBR pomocí změny bitového rozsahu mezi jednotlivými rámci.

MDCT vrsta se nepoužívá pro hlasový projev, který je WB a nižší, protože má menší účinnosti nez LP vrstva.

Hybridní mód

Hybridní mód umožňuje použití obou vrstev současně s rámcem 10 ms az 20 ms. Hybridni mód podporuje SWB a FB audio. LP vrstva se využívá na na kódování nízkých frekvencí az do WB. MDCT vrstva se využívá na vyšší frekvence. Rozdělení leží na hranici 8kHz, tedy nejvyšší WB frekvenci. U MDCT vrstvy jsou všechna pásma pod 8kHz zahozena, takže nenastává redundence kódování mezi vrstvami.

Vzorkovací frekvence

Vzorkovací frekvence může být volena nezávisle na enkodéru a dekodéru. Fullband signál může být dekódován jako wideband a naopak. Tento přístup zajišťuje, že odesilatel a příjemce jsou vždy schopni spolupracovat bez ohledu na možnosti jejich audio hardware.

Kontrolní parametry

Opus obsahuje mnoho kontrolních parametrů, které umožňují dynamicky, během práce kodeku, měnit jeho parametry bez přerušení datového toku. Tyto parametry ovlivňují pouze enkodér, který v rámci datového toku audio streamu signalizuje parametrů dekodéru. Nepoužívá se žádná přídavná signalizace paralelně s audio streamem, vše je obsaženo v něm.

Nejdůležitější parametry jsou:
- Bitrate
- Počet kanálu (Mono/Stereo)
- Šířka pásma
- Délka rámce
- Komplexita
- Odolnost proti ztrátám paketů
- Dopředná oprava chyb
- Stalý/Proměnlivý datový tok
- Přerušované vysílání

Dekodér Opus

Dekodér opus se skládá ze dvou základních částí: SILK dekodér a CELT dekodér. V jeden okamžik může být aktivní libovolný z nich či oba současně. Výstup z opus dekodéru je součtem SILK a CELT dekodéru s patřičnou úpravou vzorkovocí frekvence na straně SILK dekodéru, případně dělením na straně CELT dekodéru, pokud je vzorkovací frekvence nižší než 48kHz.

                            +---------+    +------------+
                            |  SILK   |    |   Sample   |
                         +->| Decoder |--->|    Rate    |----+
   Bit-    +---------+   |  |         |    | Conversion |    v
   stream  |  Range  |---+  +---------+    +------------+  /---\  Audio
   ------->| Decoder |                                     | + |------>
           |         |---+  +---------+    +------------+  \---/
           +---------+   |  |  CELT   |    | Decimation |    ^
                         +->| Decoder |--->| (Optional) |----+
                            |         |    |            |
                            +---------+    +------------+

CELT (MDCT vrstva)

Co je to CELT?

CELT („Constrained-Energy Lapped Transform“) byl zamýšlen jako most mezi kodeky Vorbis a Speex, tedy pro dosažení dobré komprese jak u záznamů s vysokou kvalitou, tak u mluveného slova, přičemž převzal některé myšlenky z algoritmu CELP (Code-excited linear prediction).

Základní vlastnosti

  • Bezhlavičkový
  • Libovolná vzorkovací frekvence
  • Mono/Stereo kódování
  • Fixed-point kódování a dekódování
  • VBR/constrained VBR/true CBR
  • Velmi nízké spoždění (5ms spoždění při 48kHz)
  • low-bitrate performance (‚sweet spot‘ >= 32kbps for 48kHz stereo)
  • zcela zdarma, nezatížen licenční politikou, BSD licence

Technologie

CELT jednoduchý blokový diagram

CELT jednoduchý blokový diagram

Jak už bylo řečeno, CELT je založen na MDCT (modifikovaná diskrétní kosinová transformace) s částečně překrývajícími okénky délky 5 až 22.5 ms. a na částech převzatých z projektu CELP.

Kritická pásma

Hlavní princip CELTu je, že spektrum MDCT je rozděleno na pásma tak, že odpovídají takzvanému Bark-scale (překlad do češtiny mne nenapadá, ale jedná se o nelineární rozdělení pásem, kde do 500Hz je téměř lineární, a nad 500Hz je rozdělení logaritmické – z důvodu frekvenčního maskování) rozložení. K maskování dochází, když se šířka pásma šumu rovná šířce pásma sluchového filtru. Normálně CELT vrstva používá 21 těchto pásem, kdežto OPUS může mít počet volitelný. V hybridním módu není prvních 17 pásem (až do 8 kHz) kódováno. Pásmo může obsahovat od jednoho MDCT zásobníku, až po 176 zásobníků na kanál (více v následující tabulce).

   +--------+--------+------+-------+-------+-------------+------------+
   | Vel.   | 2.5 ms | 5 ms | 10 ms | 20 ms |   Frekvence |  Frekvence |
   | rámce: |        |      |       |       |          od |         do |
   +--------+--------+------+-------+-------+-------------+------------+
   | Pásmo  |  Zásobníky:                   |             |            |
   |        |        |      |       |       |             |            |
   | 0      |      1 |    2 |     4 |     8 |        0 Hz |     200 Hz |
   |        |        |      |       |       |             |            |
   | 1      |      1 |    2 |     4 |     8 |      200 Hz |     400 Hz |
   |        |        |      |       |       |             |            |
   | 2      |      1 |    2 |     4 |     8 |      400 Hz |     600 Hz |
   |        |        |      |       |       |             |            |
   | 3      |      1 |    2 |     4 |     8 |      600 Hz |     800 Hz |
   |        |        |      |       |       |             |            |
   | 4      |      1 |    2 |     4 |     8 |      800 Hz |    1000 Hz |
   |        |        |      |       |       |             |            |
   | 5      |      1 |    2 |     4 |     8 |     1000 Hz |    1200 Hz |
   |        |        |      |       |       |             |            |
   | 6      |      1 |    2 |     4 |     8 |     1200 Hz |    1400 Hz |
   |        |        |      |       |       |             |            |
   | 7      |      1 |    2 |     4 |     8 |     1400 Hz |    1600 Hz |
   |        |        |      |       |       |             |            |
   | 8      |      2 |    4 |     8 |    16 |     1600 Hz |    2000 Hz |
   |        |        |      |       |       |             |            |
   | 9      |      2 |    4 |     8 |    16 |     2000 Hz |    2400 Hz |
   |        |        |      |       |       |             |            |
   | 10     |      2 |    4 |     8 |    16 |     2400 Hz |    2800 Hz |
   |        |        |      |       |       |             |            |
   | 11     |      2 |    4 |     8 |    16 |     2800 Hz |    3200 Hz |
   |        |        |      |       |       |             |            |
   | 12     |      4 |    8 |    16 |    32 |     3200 Hz |    4000 Hz |
   |        |        |      |       |       |             |            |
   | 13     |      4 |    8 |    16 |    32 |     4000 Hz |    4800 Hz |
   |        |        |      |       |       |             |            |
   | 14     |      4 |    8 |    16 |    32 |     4800 Hz |    5600 Hz |
   |        |        |      |       |       |             |            |
   | 15     |      6 |   12 |    24 |    48 |     5600 Hz |    6800 Hz |
   |        |        |      |       |       |             |            |
   | 16     |      6 |   12 |    24 |    48 |     6800 Hz |    8000 Hz |
   |        |        |      |       |       |             |            |
   | 17     |      8 |   16 |    32 |    64 |     8000 Hz |    9600 Hz |
   |        |        |      |       |       |             |            |
   | 18     |     12 |   24 |    48 |    96 |     9600 Hz |   12000 Hz |
   |        |        |      |       |       |             |            |
   | 19     |     18 |   36 |    72 |   144 |    12000 Hz |   15600 Hz |
   |        |        |      |       |       |             |            |
   | 20     |     22 |   44 |    88 |   176 |    15600 Hz |   20000 Hz |
   +--------+--------+------+-------+-------+-------------+------------+

V každém pásmu je zisk (energie) kódována odděleně od špičky spektra. Toto kódování usnadňuje zachování spektrální křivky signálu. Zbytek je kódován pomocí „pyramidového vektorového kvantizátoru“ (PVQ).

CELT vs Bark Scale

CELT vs Bark Scale

Přechody mezi pásmy jsou obvykle složité a problematické. CELT pro zamaskování těchto přechodů používá dvě strategie:

  • použití více menších MDCT místo jedné velké
  • dynamické časově-frekvenční rozlišení změn

Stereo

Pro kódování stereo signálu se používají tři metody

  • mid-side stereo – kóduje se střední hodnota a rozdíl levého a pravého kanálu
  • intensity stereo – kóduje se střední hodnota levého a pravého kanálu (rozdíl se zahazuje)
  • dual stereo – kóduje se levý a pravý kanál zvlášť

Blokový diagram

CELT trochu složitější blokový diagram

CELT trochu složitější blokový diagram

Přechody mezi pásmy

Značka „přechod“ (v orig. transient) označuje zda rámec používá jednu dlouhou MDCT nebo několik krátkých. Pokud je nastavena, pak koeficienty představují více krátkých MDCT v rámu, naopak pokud není nastavena, pak koeficienty představují jedinou dlouhou MDCT.

Značka je zakódovaná v bitovém toku s pravděpodobností 1/8. Kromě globální přechodové značky existuje ještě binární značka pro každé pásmo pro změnu frekvence (time-frequency, dále tf). Změna v tf je definována v dvojrozměrné tabulce tf_select_table[][], a závisí na velikosti rámu, nastavení značky transient a hodnotě tf_select. Značka tf_select používá poloviční pravděpodobnost, ale je dekódovaná jen pokud má vliv na výsledek.

Kvantizace

Protože chyba kvantizování v pozdější fázi už nemůže být kompenzována, tak je potřeba aby se kvantizace prováděla s dostatečným rozlišením. CELT používá třístupňovou strategii kvantizace, hrubá – jemná – jemná.

Hrubá kvantizace používá pevné rozlišení 6 dB. K minimalizaci datového toku se používá predikce jak v čase (předchozí rám), tak na frekvenci (předchozí pásmo).

CELT-Hruba_Kvantizace

Anti-collapse

Funkce Anti-collapse je navržena tak, aby se zabránilo situaci, kdy použití více krátkých MDCT způsobí vynulování energie v některých kanálech, což způsobuje při poslechu nepříjemné rušení.

Tomu ze zabraňuje vložením pseudo náhodného signálu o síle odpovídající minimální síle předchozích dvou rámců. De-normalizační krok je pak potřeba, aby se zajistilo zachování původní energie.

Bitová alokace

Vzhledem k tomu, že alokace bitů řídí dekódování zakódovaného proudu dat, tak aby rozhodovací proces byl stejný v kodéru i dekodéru, tak jakákoliv odchylka od reference vede k poškození výstupu. Vývojáři nejsou nijak omezeni, nicméně výsledek musí být vždy stejný.

Mnohé kodeky přenáší značné množství informací k určení alokace bitů pro rámec. CELT vrstva však může pokrývat velký rozsah pásem, a tak má velký počet číselníků pro každé pásmo. Kvůli robustnosti (při ztrátě paketů) je potřeba aby k dekódování nebyla potřeba znalost sousedních rámců, a tak explicitní signalizace číselníku pro každý rám by vedla k velké režii. Problém se zvětšuje s nízkou latencí (menší rámce).

Z tohoto důvodu OPUS v režimu MDCT používá především implicitní bitovou alokaci. Dostupná kapacita bitového proudu je předem známa jak pro kodér i dekodér bez další signalizace (zná velikost paketu protokolu vyšší úrovně). Pomocí toho kodek interpoluje alokaci z pevně dané tabulky.

CELT využívá tři explicitní mechanismy nahrazující implicitní alokaci:

  • Zesilování pásma (Band boost)
  • Ořezávání (Allocation trim)
  • Přeskakování pásem (Band skipping)

Band boost umožňuje kodéru zvětšit alokaci pro specifická pásma. Ořezávání ovlivňuje alokaci směrem k vyšším, nebo nižším frekvenčním pásmům. Třetí, tedy band skipping umožňuje vysoko frekvenční pásma zcela vynechat.

De-normalizace

Tak jak bylo každé pásmo v kodéru normalizováno, tak se musí provést inverzní operace před posledním krokem, kterým je inverzní MDCT. Každé pásmo je vynásobeno druhou odmocninou dekódované energie.

Inverzní MDCT

Inverzní MDCT nemá žádné speciální vlastnosti. Vstupem je N frekvenčních vzorků a výstupem je 2*N časových vzorků při škálování 1/2. Malý přesah oken redukuje algoritmické zpoždění. Je to odvozeno z plně přesahového (240-ti vzorkový) použitého u kodeku Vorbis.

CELT-Inverzni_MDCT

ukázka

SILK (LP vrstva)

Tzv. LP (Linear Prediction) vrstva je založena na silně upraveném kodeku SILK (). Ten byl původně uveden jako kodek pro klienta internetové telefonie Skype. Verze SILK, která je součástí OPUSu, není kompatibilní s verzí původní [RFC6716].

Podporuje pásma NB, MB a WB (viz tabulka v obecné části popisu) a velikosti rámců 10 ms až 60 ms. Je navržen pro variabilní datový tok (VBR) a umí produkovat i konstantní (CBR).

Jak je uvedeno v obecné části, SILK se stará o některé části spektra. Jedná se především o zpracování audio signálu v režimu pro řeč, nebo v hybridním režimu pro řeč vyšší kvality. Obojí do šířky audio pásma 8 kHz.

V prvním zmíněném režimu zajišťuje kódování a dekódování sám, ve druhém, hybridním, pak vede ostrá hranice na zmíněných 8 kHz. Nad ní signál zpracovává CELT/MDCT vrstva, která naopak část po 8 kHz, takže nedochází k redudanci zpracovávaných dat  [RFC6716]. V tomto režimu je velikost rámce 10 nebo 20 ms a pracuje se v pásmech SWB (super-wideband) nebo FB (fullband, plná šíře).

Stejně jako pro CELT i pro SILK platí, že vzorkovací frekvence může být volena nezávisle na pásmu. SILK interně pracuje vždy maximálně na vzorkovací frekvenci 16 kHz a to i v případě, kdy se zpracovává signál v hybridním režimu a je zapojen CELT. Pak se signál ze SILKu převzorkovává na cílovou frekvenci.

Průběh dekódování SILK

Signál je dekódován range dekodérem. Následně se dekódují parametry, z nichž se získájí hodnoty vybuzení, jako jsou LSB, volitelné koeficienty LTP a dále LPC koeficienty a zisk.
Je získán dekódovaný signál, který se v případě stereo signálu dále rozloží z mid-side na left-right.Ve finále je provedena konverze na takovou frekvenci, aby mohl být signál smíchán s vrstvou CELT.

Prvky SILK dekodéru

Blokové schéma dekodéru [RFC6716]:

        +---------+    +------------+
     -->| Range   |--->| Decode     |---------------------------+
      1 | Decoder | 2  | Parameters |----------+       5        |
        +---------+    +------------+     4    |                |
                            3 |                |                |
                             \/               \/               \/
                       +------------+   +------------+   +------------+
                       | Generate   |-->| LTP        |-->| LPC        |
                       | Excitation |   | Synthesis  |   | Synthesis  |
                       +------------+   +------------+   +------------+
                                               ^                |
                                               |                |
                           +-------------------+----------------+
                           |                                      6
                           |   +------------+   +-------------+
                           +-->| Stereo     |-->| Sample Rate |-->
                               | Unmixing   | 7 | Conversion  | 8
                               +------------+   +-------------+
  1. Zakódovaný bitový proud
  2. Zakódované parametry
  3. Pulzy, LSB a značky
  4. Hodnoty zpoždění, LTP koeficienty
  5. LPC koeficienty a hodnoty zisku
  6. Dekódovaný audio signál (mono nebo mid-side stereo)
  7. Přemixovaný signál (mono nebo left-right stereo)
  8. Převzorkovaný signál

Uspořádání LP vrstvy

TODO

Skladba SILK rámce (frame)

LP vrstva Opus rámce se může obsahovat jeden až šest SILK rámců. Volitelně
můžou být SILK rámce předcházeny tzv. LBRR SILK rámci, které se používají pro opravu chyb při přenosech. Jsou téměř shodné s plnými SILK rámci, liší se zejména v sníženém datovém toku.

Rámce se dále skládají ze dvou nebo čtyř subrámců o délce 5 ms, které se mohou lišit v různých parametrech, jako jsou kvantizační zisk, koeficienty filtrů apod.

* typ rámce
* typ kvantizace
* kvantizační zisk
* koeficienty predikčního filtru
* interpolační váhu LSF
* zpoždění a zisky LTP filtru
* LCG seed
* vlastní kvantizovaný budicí signál

Predikční váhy pro stereo

TODO

Typ rámce

TODO

Zisky subrámce

TODO

Normalizované LSF a LPC koeficienty

Za hodnotami kvantizačního zisku se nacházení normalizované LSF koeficienty představující LPC koeficienty pro aktuální rámec SILK.

TODO

LTP parametr

Rámce s hlasem používají doplňkové LTP parametry. Slouží ke zjemnění, vytvoření indexu prodlev (lag index)  pro každý subrámec za použití vektorového kvantizátoru. Každý subrámec pak také obsahuje predikční koeficient zisku.

Vybuzení

SILK kóduje vybuzení modifikovanou metodou Pyramid Vector Quantizer kódování (PVQ). SILK navíc používá kódování s proměnnou délkou a u rozsáhlých číselníků (kódovacích tabulek, codebooks) kóduje LSB přímo, což významně snižuje výpočetní čas a velikost ROM potřebnou pro dekódování [RFC6716].

PVQ kódovací tabulka je navržena hodnoty roložené Laplaceovou distribuční funkcí. Kódovací tabulka obsahuje všechny kódovací vektory y o velikosti N, které splňují.

SILK: Vybuzení

Rekonstrukce SILK rámce

Zpracování probíhá po subrámcích, jelikož se hodnoty parametrů jako kvantizační zisk, LTP a případně i LPC parametrů mohou mezi jednotlivými subrámci lišit. Zpracování nemusí být zcela přesné na bitové úrovni. Chyby, které se takto mohou vyskytnout, způsobují pouze malé zkreslení.

Přemixování do sterea

Po překódování rámce z každého kanálu stereo proudu musí dekódér zkonvertovat mid-side formát na left-right stereo formát. Predikce side kanálu probíhá pomocí středního kanálu skrze jednoduchou dolní propusť nebo za použití nefiltrovaného středního kanálu pomocí dekódovaný predikčních vah.

Jednoduchá dolní propusť přináší zpoždění o délce jednoho vzorku. Encoder musí zajistit, aby mono i stereo proudy toto zpoždění obsahovaly a bylo možno mezi nimi přepínat.

Převzorkování

Převzorkování je nutné v případě dekódování hybridního rámce vzorkovaného SWB nebo FB, nebo v případech, kdy je potřeba mít na výstupu jiné vzorkovací frekvence, než interně používá SILK. Metoda převzorkování není stanovena.

Je vymezena doba pro práci (pře)vzorkovače a tato doba se použije i pro zpoždění na MDCT vrstvě.

Seznam zkratek

LBRR: Low Bit-rate Redundancy
LCG: Linear Congruential Generator
LP: Linear Prediction
LPC: Linear Predictive Coding
LSFs: Line Spectral Frequencies
LTP: Long-Term Prediction
PDF: Probability Distribution Function
PLC: Packet Loss Concealment
PVQ: Pyramid Vector Quantizer
MDCT: Modified Discrete Cosine Transform
VAD: Voice Acivity Detection
VQ: Vector Quantizer

Zdroje

  • [RFC6716] IETF. RFC 6716: Definition of the Opus Audio Codec. http://tools.ietf.org/html/rfc6716
  • [OPUS-GIT] Opus Git repository. Ukázková implementace kodeku. https://git.xiph.org/opus.git
  • [OPUS-DEMO] Opus Examples. Interaktivní dema kodeku. http://opus-codec.org/examples/

powered by EndomondoWP