Bx skrev:
coolbiz skrev:
Derimot ser det for mitt halvstuderte hode ut som om Oblivion har rett i at dersom denne konverteringen (bitskift + padding med '0') er alt som gjøres, ender man opp med et signal der hele waveformen er 1/2 LSB (16-bits LSB, altså) feil i nivå. Hvordan dette faktisk er implementert i ESS' eller andre produsenters konvertere har jeg ingen formening om. Det virker litt underlig at ikke konstruktørene har tenkt på dette.
Det man må huske på her, er at det analoge nullpunktet til en 24 bit dac ligger litt høyere enn til en 16 bit dac.
Jeg bruker sikkert ikke korrekt terminologi her. Så jeg må kanskje forklare hva jeg mener med nullpunkt. En DAC kan ses på som en positiv spenningsregulator som leverer spenninger mellom 0 og 2V alt ettersom hvilken digital verdi som kommer inn. Så justerer man spenningsnivåene til slutt slik at tallet null inn gir 0V ut, dvs Fjerne DC. Men før man fjerner DC:
Når det største negative tallet som DAC-en kan håndtere kommer inn, så vil en slik DAC levere en 0 V ut. Når det største positive tallet kommer inn, vil DAC-en levere 2 V ut. Når null kommer inn vil DAC-en ikke levere nøyaktig 1V ut. Fordi det er alltid ett flere positive tall enn negative tall vi har til rådighet.
En 24 bit dac har et nullpunkt som ligger høyere, og nærmere Vmax / 2 enn en 16 bit dac.
Akkurat som en 3 bit dac har høyere nullpunkt enn en 2 bit dac.
2 bit:
00 = -1
01 = 0
10
11 = +2
Nullpunkt = 1/3 av Vmax
3 bit:
000 = -3
001
010
011 = 0
100
101
110
111 +4
Nullpunkt = 3/7 av Vmax
Det samme skjer når man går fra 16 bit DA til 24 bit DA. Nullpunktet flytter seg nærmere midten.
Men dette er en egenskap med selve DA konverteren og har ingen ting med selve signalet å gjøre. 24 bit konvertere SKAL ha høyere spenning på nullpunktet enn 16 bit konvertere.
Oblivions konvertering endrer kurveformen på det som kommer ut av konverteren. Den øker avstanden mellom positive og negative verdier med en konstant størrelse. Hvis det er en sinus som går inn, så er det en sinusbølge med strekkmerker på midten som kommer ut. De svake partiene av sinusen blir relativt sett forsterket svært mye mer enn de sterke partiene. Et annet ord for dette er komprimering. Det kan godt hende enkelte synes dette låter bedre fra tid til annen. Kanskje akustikken i opptaket kommer tydeligere fram? Det er jo også mange som liker komprimering generelt sett.
Konverteringen introduserer også en negative DC komponent, ettersom alle negative verdier er blitt øket mens de positive er uendret. Og som alltid når man endrer kurveformen så introduserer man harmonisk forvrengning.
Hvis man derimot gjør det etter boka, dvs 0-padder både positive og negative verdier, så beholder man kurveformen og flytter nullpunktet oppover. Og det er akkurat dette 24 bit dac-en trenger for å levere en korrekt analog kurveform som er fri for DC.
Bernt jeg undrer meg: er det er MULIG å programmere tall manipulasjoner korrekt i Audiolense når du lager slike eksempler og forklaringer ???
Under har jeg tatt dine eksempler og lagt inn med rødt de VIRKELIGE verdiene dine 2 og 3 bit data egentlig representerer sett i forhold til en DAC og two´s compliment code:
2 bit:
00 = -1 => 0
01 = 0 => +1
10 => -2
11 = +2 => -1
Nullpunkt = 1/3 av Vmax
3 bit:
000 = -3 => 0
001 => +1
010 => +2
011 = 0 => +3
100 => -4
101 => -3
110 => -2
111 +4 => -1
Nullpunkt = 3/7 av Vmax
Under her har jeg lagt inn 8 bit data og de verdiene de egentlig representerer som signed eller om du vil - two´s compliment:
most-significant bit
0 1 1 1 1 1 1 1 = 127
0 1 1 1 1 1 1 0 = 126
0 0 0 0 0 0 1 0 = 2
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 0 0 = 0
1 1 1 1 1 1 1 1 = ?1
1 1 1 1 1 1 1 0 = ?2
1 0 0 0 0 0 0 1 = ?127
1 0 0 0 0 0 0 0 = ?128
8-bit two's-complement integers
Det underlige er at du ikke har fått med deg det faktum at de lyd data som en DAC normalt mottar er
two´s compliment code
Under her har jeg lagt inn 8 bit data og de verdiene de egentlig representerer som unsigned:
most-significant bit
0 1 1 1 1 1 1 1 = 127
0 1 1 1 1 1 1 0 = 126
0 0 0 0 0 0 1 0 = 2
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 0 0 = 0
1 1 1 1 1 1 1 1 = 255
1 1 1 1 1 1 1 0 = 254
1 0 0 0 0 0 0 1 = 129
1 0 0 0 0 0 0 0 = 128
8-bit unsigned integers
Så gjennstår det følgende for å kunne forstå hvordan en DAC behandler den two´s compliment CODE den mottar:
Når en LSB ekstender et 8-bit tall til for eksempel 9-bit MÅ en forstå at det er 0.5 desimalt (eller en verdi som er lavere enn det den laveste av de orginale 8-bit representerte) en legger til eller trekker fra og IKKE at 127 desimalt blir til 255 desimalt etc...
Det er tross alt en bit som representerer lavere verdier enn den orginale LSB...
Når jeg i eksemplene under har skrevet en "." mellom 8-ende og 9-ende bit er det ikke float (floating point),
men kun for å markere at den LSB ekstendede bit representerer en verdi på 0.5 - altså en verdi mindre enn 1 eller den verdi som den orginale LSB har/hadde...
Hvis et 8-bit tall blir LSB ekstended til 9-bit korrekt med "0" for positive og "1" for negative samples blir det som følgende:
most-significant bit Extended
0 1 1 1 1 1 1 1 . 0 = 127
0 1 1 1 1 1 1 0 . 0 = 126
0 0 0 0 0 0 1 0 . 0 = 2
0 0 0 0 0 0 0 1 . 0 = 1
0 0 0 0 0 0 0 0 . 0 = 0
1 1 1 1 1 1 1 1 . 1 = ?1
1 1 1 1 1 1 1 0 . 1 = ?2
1 0 0 0 0 0 0 1 . 1 = ?127
1 0 0 0 0 0 0 0 . 1 = ?128
8-bit two's-complement integers ekstended with one LSB
Hvis et 8-bit tall blir LSB ekstended til 9-bit korrekt med "0" for positive og "1" for negative samples blir det som følgende:
* (lagt til for å vise økt linjaritet ved 9-bit oppløsning med ellers korrekt LSB extending)
most-significant bit Extended
0 1 1 1 1 1 1 1 . 0 = 127
0 1 1 1 1 1 1 0 . 0 = 126
0 0 0 0 0 0 1 0 . 0 = 2
0 0 0 0 0 0 0 1 . 1 = 1.5 *
0 0 0 0 0 0 0 1 . 0 = 1
0 0 0 0 0 0 0 0 . 1 = 0.5 *
0 0 0 0 0 0 0 0 . 0 = 0
1 1 1 1 1 1 1 1 . 0 = ?0.5 *
1 1 1 1 1 1 1 1 . 1 = ?1
1 1 1 1 1 1 1 0 . 0 = ?1.5 *
1 1 1 1 1 1 1 0 . 1 = ?2
1 0 0 0 0 0 0 1 . 1 = ?127
1 0 0 0 0 0 0 0 . 1 = ?128
8-bit two's-complement integers ekstended with one LSB
Hvis et 8-bit tall blir LSB ekstended til 9-bit med "0" for både positive og negative samples blir det følgende feil:
most-significant bit Extended
0 1 1 1 1 1 1 1 . 0 = 127
0 1 1 1 1 1 1 0 . 0 = 126
0 0 0 0 0 0 1 0 . 0 = 2
0 0 0 0 0 0 0 1 . 0 = 1
0 0 0 0 0 0 0 0 . 0 = 0
1 1 1 1 1 1 1 1 . 0 = ?0.5
1 1 1 1 1 1 1 0 . 0 = ?1.5
1 1 1 1 1 1 1 0 . 0 = ?2.5
1 0 0 0 0 0 0 1 . 0 = ?127.5
1 0 0 0 0 0 0 0 . 0 = ?128.5
8-bit two's-complement integers ekstended with one LSB
Hvis et 8-bit tall blir LSB ekstended til 9-bit med "1" for både positive og negative samples blir det følgende feil:
most-significant bit Extended
0 1 1 1 1 1 1 1 . 1 = 127.5
0 1 1 1 1 1 1 0 . 1 = 126.5
0 0 0 0 0 0 1 0 . 1 = 2.5
0 0 0 0 0 0 0 1 . 1 = 1.5
0 0 0 0 0 0 0 0 . 1 = 0.5
1 1 1 1 1 1 1 1 . 1 = ?1
1 1 1 1 1 1 1 0 . 1 = ?2
1 0 0 0 0 0 0 1 . 1 = ?127
1 0 0 0 0 0 0 0 . 1 = ?128
8-bit two's-complement integers ekstended with one LSB
Det er fullt mulig at jeg tidligere har forklart / uttrykt meg utydlig eller tvetydig, og det kan skyldes at jeg ikke "tenker" paste / kopi fra wikipedia eller lignende, men at jeg i tankene er inne i hardwaren i en DAC og forklarer ut fra den fysiske virkemåten.
Resten av "forklaringen" din tror jeg vi forbigår i stillhet.....