Care e problema cu samplarea?

Prin acest titlu incercam usor, sa patrundem putin in adancimea procesarii digitale ale semnalelor. Nu la nivel de explicarea Nyquistului… Mai adanc. Speram sa va fie de folos. Daca ati reusit vom continua.

Un DAW numai exista fara sampler. Programele sequencer si workstation-urile de foarte mult timp includ tool-uri cu aceasta denumire. Facilitatile si utilizabilitatea difera foarte mult, insa mai putine cuvinte se spun despre calitatea soundului. Nu trebuie exagerata niciuna dintre calitatile de baza unui sampler pentru ca trebuie acceptat si faptul ca nu are nici un rost ca un sampler sa aiba algoritmi perfecti, daca interfata nu serveste instantaneu dorinta de realizare a ideilor muzicale in timpul compozitiei. Cum e sa apesi stop in timpul creatiei unei secvente pentru a desena o curba de control pentru filtrul unui sampler daca acesta nu suporta asocierea butoanelor la controloare MIDI? Neplacut si frustrant.
Ai in minte deja soundul creat insa pana cand desenezi si ajustezi parametri ai uitat de tot, ai pierdut ritmul si s-ar putea sa pierzi si inspiratie chiar daca esti expert si faci ajustarile in 8 secunde.
Samplerul este un instrument, iar instrumentele muzicale trebuie sa te serveasca. Bineinteles aceasta problema astazi e putin anacronistica dar vreau sa spun ca articolul de fata nu vrea sa exagereze importanta nucleului de algoritmi al unui sampler, insa pe cand facilitatile si utilizabilitatea se percepe aproape fara constientizare de catre utilizator, calitatea se percepe mai greu si se intampla des cazuri cand sound-ul ti se pare slab oricat ai lucra la ea, iar tu te invinovatesti singur si te gandesti la cauze cum ar fi lipsa masteringului. Gresit. Cum masteringul poate aduce un surplus de max 20% calitativ (greu de cuantificat dar e imaginabil), un filtru sau o interpolare proasta al unui sampler nu se mai poate corecta dupa mixaj. Aceeasi problema am si cu multe pluginuri de synth dar aceasta va constitui tema unui alt articol.

In majoritatea cazurilor samplerul se foloseste in 2 moduri:
– redarea unor librarii de instrumente samplate sau ritmuri, efecte si elemente vocale. Aceasta implica un proces de incarcare simpla dupa care dupa gust sau dorinta se aplica filtre, efecte, infasuratoare etc.
– inregistrarea, ordonarea si crearea soundurilor si librariilor samplate. Acest proces este mai complicat, necesita experienta si cunostinte de sound-design, inregistrare acustica, principii de layering si resampling.

De unde provin problemele?
Principial, calitatea unei librarii este direct proportionala cu densitatea tonala a notelor samplate. Cei care au activat in epoca trackerilor mai tin minte cum suna un sound de pian cantat pe diferite registre. Efectul „natural” il putea avea in cazurile bune pe o octava: pe octava din imprejurul notei original inregistrate. Daca doreai sa scrii o piesa de pian, trebuia sa te folosesti de mai multe sounduri de pian, dedicate diferitelor registre. Iar in acest caz daca soundurile proveneau din diferite surse (diferite piane) notele adiacente din cele doua sounduri aveau timbrul foarte diferit. In momentul de fata librariile bune nu au astfel de probleme, insa ce se intampla cand doresti sa samplezi un alt instrument sau daca te folosesti de librarii vechi (AKAI, E-MU) care nu excelau in numar de MB sau GB si totusi sunau foarte bine si prezinta marca unor stiluri muzicale?
Daca ai un singur ton inregistrat samplerul calculeaza celalalte note prin simpla pitch shifting, adica modificarea vitezei de redare a sunetului. Cum probabil toti cunoasteti bazele conceptiei audio-digitale stiti ca pentru a afla nota adiacenta unei note viteza trebuie marita (sau scazuta, in functie de directia calculului) cu o radacina de ordin 12 din 2. Adica: frecventa notei respective cantate cu o octava mai sus necesita o viteza de redare exact dubla. Iar in jos viteza se imparte la doi.

Pare foarte simplu, insa cum am vazut si in cazul pianului, intervalul utilizabil este foarte restrans. Deci trebuiesc folosite mai multe sample-uri intre care samplerul va face trecerile. Pianul are un timbru special, cea mai importanta sectiune fiind tranzientul lui, adica primele milisecunde din timbru, fara care sunetul de pian e aproape de nerecunoscut. Incercati si voi: taiati foarte putin de la inceputul unui sample de pian.
De aici provine si problema sintezei sunetului de pian, dar aceasta este o alta mancare de peste. Deci accelerand sau decelerand viteza de redare al unui sound de pian se modifica cu aceeasi proportie si lungimea tranzientului ceea ce in realitate nu se intampla la fel.

Simplificam exemplul nostru ca sa evidentiam ca problemele noastre apar deja mai mult adanc. Evident, soundul de pian e prea complex pentru a o folosi drept exemplu. Din extrema cealalta ne vom folosi de forma de unda sinusoidala. Aici nu ar trebui sa avem probleme cu timbrul variabil in decursul unei declansari sau cu infasuratoarea (envelope), pentru ca nu avem asa ceva.
Sa spunem ca avem o sinusoidala samplata de 220Hz. Si cu acesta vrem sa cantam pe intreaga claviatura de 5 octave.
220Hz e La3, iar noi dorim sa cantam La4. Adica 2x220Hz=440Hz, deci esantionul nostru trebuie redat la dubla viteza.
Sa spunem ca avem urmatoarea secventa de esantioane din sunetul nostru testat:

… x(n) x(n+1) x(n+2) x(n+3) x(n+4) x(n+5) x(n+6) x(n+7) …

Fiind vorba de sistemul digital discret, acest sir redat la dubla viteza va insemna (cu aceeasi rata de samplare la partea de playback):

… x(n) x(n+2) x(n+4) x(n+6) …

La prima vedere deci putem spune ca la dublarea vitezei vom “uita” de fiecare al doilea esantion. Acest proces este aceeasi cand o poza de rezolutie inalta se micsoreaza. Presupun ca toti ati vazut ce se intampla unei poze micsorate cu o procedura primitiva: liniile oblice continue din poza devin abrupte, apar “trepte”, continuitatea sufera. Acest efect se numeste „aliasing”. Motivul este ca o micsorare primitiva a pozei nu face altceva decat inlatura pixelilor din imagine. In programele moderne de prelucrare a imaginilor chiar si un preview deja presupune o imediata resamplare care inlatura aceste efecte. Imediat vedem ce face acest „resampling”. Pana atunci sa avem doua exemple care ne ajuta la intelegerea problemei. Fie primul exemplu un caz extrem:
Avem o imagine de 8×8 cu pixeli de culoare:

negru alb   negru alb   negru alb   negru alb
verde verde verde verde verde verde verde verde
negru alb   negru alb   negru alb   negru alb
verde verde verde verde verde verde verde verde
negru alb   negru alb   negru alb   negru alb
verde verde verde verde verde verde verde verde
negru alb   negru alb   negru alb   negru alb
verde verde verde verde verde verde verde verde

Adica:

Vrem ca aceasta imagine sa o micsoram la marimea 4×4. Ce obtinem prin simpla inlaturare a fiecarui al doilea pixel?

NEGRU pe 4×4.

O solutie total incorecta pentru ca in imaginea originala negrul ocupa doar 25% din suprafata iar acuma 100%.

Am gasit deci prima problema, dar sa mergem mai departe.

Cum procedam daca dorim sa cantam cu o octava mai jos (110Hz)? Exact invers adica trebuiesc intercalate valori dupa fiecare esantion cumva astfel:

… x(n) k(n) x(n+1) k(n+1) x(n+2) k(n+2) x(n+3) k(n+3) x(n+4) k(n+4) …

Ce valoare va avea seria k? Aha! Aici intampinam prima problema.
Cea mai simpla modalitate este sa-i asociam lui k(i) valoare lui x(i) sau x(i+1) peste tot. Procedeul de asociere a valorilor intercalate se numeste interpolare. Iar acest tip de interpolare (cel mai primitiv de altfel) se numeste interpolarea „nearest sample”.

Sa vedem ilustrat prin valori:

18 35 51 66 78 88 95 99
18 18 35 35 51 51 66 66 78 78 88 88 95 95 99 99

Se vede din valori ca aceasta nu este ceea ce „pretinde” sinusoidala. In cazul ideal (acceptand reprezentarea prin numere intregi a fi ideala… ha-ha) asa ar trebui sa arate:

18 27 35 43 51 59 66 72 78 84 88 92 95 98 100

Ce se intampla in spectrul sunetului daca folosim metoda „nearest sample”? La prima vedere a cifrelor se poate spune ca lipseste acuratetea. Trebuie stiut ca spectrul formei de unde este cel mai curat spectru.


Spectru sinusoidal la 110Hz
Ppe orizontala avem timpul, pe verticala frecventa. Cum avem o sinusoidala in timp constanta, fara modulatii in forma de unda, caracteristica e uniforma.

In spectrul frecventei sinusiodale avem o singura linie: linia care reprezinta vizual frecventa undei. Toate celalalte forme de unde (chiar si cele simple) pe langa frecventa de baza contin o serie de alte frecvente, care se numesc armonici.

Cum seria de valori creata de metoda primitiva de interpolare „nearest sample” numai reprezinta valorile formei de unda sinusoidale ci a unei forme complexe apar o serie de armonici in spectru. Aceste armonici de frecventa inalta sunt zgomotele de interpolare.


Spectrul sinusoidale prin interpolarea “nearest-sample”

Cu cat diferenta intre unda ideala si cea resamplata este mai mare cu atat amplitudinea zgomotelor creste. Deci in consecinta trebuie gasita o alta metoda de aproximarea valorilor intercalate. Majoritatea algoritmilor se folosesc de diferite aproximari polinomiale. Suna complicat dar pentru a intelege acest termen considerati astfel: pentru calcularea valorilor intermediare, algoritmul se foloseste de valorile esantioanelor din vecinatatea punctului de calculat. Valorile vecine se pondereaza diferit, depinzand de algoritm.

Urmatoarea varianta in complexitate este interpolarea liniara adica pentru bucata noastra sinusoidala “decelerata” vom obtine:

18 26.5 35 43 51 58.5 66 72 78 83 88 91.5 95 97 99

Cum se calculeaza? In cazul nostru formula e simpla: media punctelor vecine ( y(j) = [y(i)+y(k)]/2). In teorie si in majoritatea cazurilor cand pitchingul nu se face in octave, interpolarea liniara plaseaza valoarea esantionului de calculat pe segmentul „tras” intre cele doua puncte adiacente intre care se face calculul.


Figura reprezentand interpolarea liniara: punctele rosii reprezinta punctele de pe traiectoria perfecta a sinusoidalei. Presupunand ca trebuie sa aproximam fiecare al doilea punct rosu din caracteristica sinusoidalei, prin interpolarea liniara, calculam pozitia punctelor albastri.
Linia albastra abate din ce in ce mai mult spre varful sinusoidalei:

Formula in general:

y(j) = [(j-i)*y(k)+(k-j)*y(i)] / (k-i)  , unde y(i) si y(k) sunt esantioanele momentelor i si k care sunt vecinatatile lui j, adica i < j < k.

Din definitia interpolarii liniare reiese ca si aici apar zgomote de alias evidente, pentru ca forma de unda sinusoidala nu are liniaritate si astfel aproximarea cu puncte coliniare adiacente aduce slabe rezultate. Reducerea zgomotelor de aliasing se cuantifica prin imbunatatirea ratei SNR (Signal To Noise Ratio).
Printre alte metode de interpolare se numara Hermite si Bicubic. Bicubic este o interpolare in plan, bidimensionala, si din aceasta cauza e ideala pentru grafica.

Iata ca din exemplul nostrum luat din grafica ce obtinem prin interpolarea cubica, daca o reducem (downsample) la dimensiunea de 50%.  Un rezultat mai real decat cel de full-negru.

Hermite insa se poate folosi principial pentru oricate dimensiuni se doreste insa este foarte buna si pentru cazul nostru pentru ca este foarte buna la curbele bidimensionale. Iar sample-ul nostru, vizual este o curba caruia se cauta punctele intermediare. Hermite se foloseste ca date de start: punctul de start si final intre care se lucreaza, respectiv vectorii tangenti pentru punctul de start si final. Algoritmul are 4 functii de baza care se inmultesc cu datele de intrare iar apoi se insumeaza. Pare complicat, insa metoda are o reprezentare matriceala care simplifica vizual formula.

Analizand performantele algoritmilor relatate la rezultatele scontate se poate spune ca algoritmii polinomiali de ordine mica sunt mai buni pentru ca  crescand ordinul polinomial numarul calculelor necesare creste foarte mult, iar calitatea cu mult mai putin.

Rezultate foarte bune se pot castiga prin modele convolutionale. Utilizand filtre FIR (finite impulse response) se aplica ferestre de raspuns al unor impulsuri esantionate asupra sample-ului original upsamplat. La upsamplare se insereaza zerouri (zero-stuffing) intre esantioanele sirului original. Zerourile sunt valori mai bune decat valorile esantionului vecin si pentru faptul ca simplifica calculele la aplicarea filtrului, adica reduce semnificativ timpul de calcul. Depinzand de ordinal de resamplare algoritmul FIR creaza un numar de subfiltre polifazate, adica decalate pe parcursul unui buffer creat din valorile de intrare ale sirului upsamplat.
Problemele apar la rate mari de resampling unde cerintele de calcul cresc foarte mult, insa cel mai important impediment pentru resamplare realtime este ca procesul poate calcula doar o singura rata de resamplare, iar in cazul unei sampleri pentru fiecare clapa apasata este nevoie de o alta resamplare.
Fapt interesant: interpolarea liniara este si ea o varianta a filtrului FIR variabil in timp de forma y(n) = A(n) x(n) + [1-A(n)] x(n-1), unde A(n) are valoarea de 0.5.

Cele mai bune rezultate se pot obtine cu interpolarea limitata pe banda folosind functia sinc (sinus cardinal). Matematica lui mai complexa poate fi citita aici

Intorcandu-ne la cvantificarea notelor la diferite frecvente pornind dintr-un singur sample trebuie sa concluzionam, ca regula generala a resamplingului presupune un upsampling la o frecventa de esantionare inalta dupa care se aplica decimarea. Decimarea inseamna “aruncarea” a unor esantioane anume care nu vor face parte din sirul de esantioane la noua rata de sampling mai scazut.
Exemplul foarte des de aplicatie exacta: conversia de la 48kHz la 44kHz. Factorul de resamplare (F = sample rate final / sample rate original) este 44100 / 48000 care va rezulta intr-o valoare fractionala (0.91875). Pentru ca in aplicatii practice un up/downsampling de factor fractional computational e dificil (trebuie calculat la al catelea esantion si cate zerouri trebuiesc “bagate”),  solutia este sa se gaseasca valoarea intreaga a factorului de upsampling si valoarea intreaga a factorului de decimare. 44100 / 48000 simplificat da 147 / 160. Adica sirul de esantioane trebuie upsamplat cu factorul de 147, iar dupa interpolare decimat cu factorul 160 (adica mentinut 1 din cate 160 de esantioane).

Un exemplu mai vizibil cu un factor de resampling 2/3:

Avem seria originala de esantioane:

78.8

79.2

79.7

80.1

80.5

80.9

81.4

81.8

82.2

82.6

Dupa un factor de upsampling de F=2, prin zero-stuffing obtinem:

78.8

0.0

79.2

0.0

79.7

0.0

80.1

0.0

80.5

0.0

80.9

0.0

81.4

0.0

81.8

0.0

82.2

0.0

Dup ace filtram printr-o metoda adecvata:

78.8

79.0

79.2

79.4

79.7

79.9

80.1

80.3

80.5

80.7

80.9

81.2

81.4

81.6

81.8

82.0

82.2

82.4

Decimam cu factorul 3, adica mentinem doar fiecare al treilea esantion

78.8

79.4

80.1

80.7

81.4

82.0


Spectrul undei sinusoidala de 110Hz, dupa un upsampling de factor 2, cu zero-stuffing.
Se poate vedea cum se indeseste spectrul fata de sinusoidala originala.

Iata ca am atins problematica de baza a samplerelor. Nu uitati ca testarea samplerelor din acest punct de vedere este relativ usoara: creati o unda sinusoidala perfecta (de perioade intregi, adica multiplicata una dupa cealalta sa mentina caracteristica sinusoidala) intr-un program de editare wave. Salvati-o si incarcati acest wave in diferite samplare. Comandati redarea unei note diferite ca frecventa de frecventa initiala la care a fost creata sinusoidala. Salvati aceasta “creatie in wave” astfel ca host-ul sa nu-i aplice nici un fel de “finisare” de tip dithering care sa amelioreze zgomotele alias. Wave-ul creat incarcati intr-un wave editor capabil sa afiseze o analiza grafica a spectrului. Incercati testul cu diferite frecvente, daca se poate sub acelasi host. Veti observa diferente uriase!

Recapitulare stiintifica: Upsamplingul este inserarea a valorilor “0” (zero) in sirul de esantioane intre valorile originale. Spectrul upsamplingului astfel va contine o serie de frecvente nedorite, adica zgomote. Interpolarea in sine va face reducerea acestor distorsiuni, prin aproximarea valorilor inserate sau filtrare. In cazul filtrarii se utilizeaza un filtru trece jos, care inlatura aceste zgomote care apar peste frecventa Nyquist (x1/2) al ratei de esantionare de intrare.  Rata de upsampling (numarul esantioanelor finale / cele originale) este astfel tot timpul o valoarea intreaga. Valori fractionale (dorita in majoritatea cazurilor) se obtine prin interpolare si decimare.

Lasă un răspuns

Adresa ta de email nu va fi publicată.

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.