/ Forside / Karriere / Uddannelse / Højere uddannelser / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Højere uddannelser
#NavnPoint
Nordsted1 1588
erling_l 1224
ans 1150
dova 895
gert_h 800
molokyle 661
berpox 610
creamygirl 610
3773 570
10  jomfruane 570
DCT-implementation og finurligheder
Fra : Jakob Nielsen


Dato : 22-02-04 19:04

forsøger lidt jpeg kompression, men er lidt usikker på hvad min
implementation af en DCT egentlig giver mig. Har lavet en lille test i 1D,
hvor jeg har lavet en 1d array på 1000 samples hvori jeg har en sinusoide
givet ved cos(2*3.1415*t/10)*12
Det giver over de 1000 samples 100 fulde svingninger, hvilket er hvad jeg
forventer.
Imidlertid er det i index 200 i resultatvektoren fra DCT at jeg får pinden,
og ikke i 100. Hvordan kan det være at frekvensen står til det dobbelte? Jeg
forventer at et dc signal ligger i index 0 i resultatvektoren, og at et
signal der kan foretage 100 svingninger i simpleintervallet kommer i index
100. Hvad er grunden til at det ligger i 200 istedet? Det vil sige at den
maksimale frekvens er for et signal der foretager 500 fulde svingninger i
sampleintervallet.

En anden ting er at størelsen af koeficienten bliver for stor ved anvendelse
af den formel jeg fandt frem.
resultatet er summen af multiplikationerne mellem alle inddata og hver værdi
i DCT matrisen/vektoren. Jeg skal dog dele dette med sqrt(antallet af
samples). Er dette korrekt? Indgår en division med sqrt(n) i den gængse
udledning af DCT resultaterne, eller er det en fejlagtig lappeløsning jeg
fandt frem til?




 
 
Jesper Toft (22-02-2004)
Kommentar
Fra : Jesper Toft


Dato : 22-02-04 19:48

Jakob Nielsen wrote:

> Imidlertid er det i index 200 i resultatvektoren fra DCT at jeg får
> pinden, og ikke i 100. Hvordan kan det være at frekvensen står til det
> dobbelte?

Du kan ikke se på dette som frekvenser, som du kan med en DFT. DCT er også
fase afhænging. Prøv for eksempel at fase forskyde dit signal PI/2. Dette
skulle med en DFT give præcist det samme signal blot drejet PI/2 i det
komplekse plan. Men med en DCT giver det noget helt andet, dit toppunkt
flytter sig, da der ikke er noget komplekst plan.

> resultatet er summen af multiplikationerne mellem alle inddata og hver
> værdi i DCT matrisen/vektoren. Jeg skal dog dele dette med sqrt(antallet
> af samples). Er dette korrekt? Indgår en division med sqrt(n) i den gængse
> udledning af DCT resultaterne, eller er det en fejlagtig lappeløsning jeg
> fandt frem til?

Det er somend rigtig nok, der indgår både division og sqrt. Dette gør dog
ikke noget implementations messigt, da n er en konstant der kan ganges ind
i summen og derefter ganges på cosinus tabellen.

--
/Jesper


Jakob Nielsen (22-02-2004)
Kommentar
Fra : Jakob Nielsen


Dato : 22-02-04 20:58

> Du kan ikke se på dette som frekvenser, som du kan med en DFT. DCT er også
> fase afhænging. Prøv for eksempel at fase forskyde dit signal PI/2. Dette
> skulle med en DFT give præcist det samme signal blot drejet PI/2 i det
> komplekse plan. Men med en DCT giver det noget helt andet, dit toppunkt
> flytter sig, da der ikke er noget komplekst plan.

Mit toppunkt flytter sig nu ikke, men det bliver mere udglattet efterhånden
som jeg faseforskyder det. Istedet for at give en pind med næsten samme
størelse som signalets amplitude, og to ganske små på næsten samme position,
så får jeg en pind på næsten halv amplitude og knap ti mindre pinde der
klinger af efter hovedpinden.
Er dette så ikke også et problem med billeder? Der kan signalet som sådan
også være faseforskudt, skulle jeg mene.

At DCT ikke giver frekvenser, betyder det at det ikke er metoden til
beregning af lydspektrum? Fourier er som sådan lige så simpel at
implementere, hvis man ikke skal forstå ideen 100%, men nu har jeg set mig
lun på DCT, da den tydeligvis er bedre til den analyse man anvender til
jpeg.


> Det er somend rigtig nok, der indgår både division og sqrt. Dette gør dog
> ikke noget implementations messigt, da n er en konstant der kan ganges ind
> i summen og derefter ganges på cosinus tabellen.

Ja eller ganges ind i matrisen før man ganger sine data på?

Har du eller andre en forklaring på at index n i min frekvens-vektor
indeholder amplituden for frekvensen n/2?



Jesper Toft (22-02-2004)
Kommentar
Fra : Jesper Toft


Dato : 22-02-04 21:52

Jakob Nielsen wrote:

> At DCT ikke giver frekvenser, betyder det at det ikke er metoden til
> beregning af lydspektrum?

Det kan vel godt give et pseudu billede at lydspektret.. Kommer vel an på
hvilke informationer man skal bruge..

> Fourier er som sådan lige så simpel at
> implementere, hvis man ikke skal forstå ideen 100%, men nu har jeg set mig
> lun på DCT, da den tydeligvis er bedre til den analyse man anvender til
> jpeg.

Nu er DCT en del af jpeg standarden, så det vil være dumt at bruge en dft i
stedet
DCT benyttes istedet for DFT, fordi kraftig kvantistering i de høje
frekvenser ikke giver så store udsving i de yderste samples. Derved slipper
man for at bruge vinduer og overlap.

>> Det er somend rigtig nok, der indgår både division og sqrt. Dette gør dog
>> ikke noget implementations messigt, da n er en konstant der kan ganges
>> ind i summen og derefter ganges på cosinus tabellen.
> Ja eller ganges ind i matrisen før man ganger sine data på?

Nemlig.

> Har du eller andre en forklaring på at index n i min frekvens-vektor
> indeholder amplituden for frekvensen n/2?

Thjae.. Du kan løse det matematisk:

DCT hedder:
DCT[k] = sum( x[n] * cos( ( (2k+1)*u*PI )/ ( 2*M) )

Hvor du har x[n] == cos(2*PI* u * f)

sum( cos(2*PI* u * f) * cos( ( (2k+1)*u*PI )/ ( 2*M) )

summen er fra u=0 til u= noget meget stort, derved vil ovenstående give det
største tal hvis:

2*PI* u * f = ( (2k+1)*u*PI )/ ( 2*M)
hvilket ca er:
2*PI* u *f = 2k*u*PI/2*M
dvs
k = f*2*M

du har i dit eksempel f=0.1 og M = 1000
=> k = 200.

det vil sige du vil have max i DCT[200].

--
/Jesper


Jakob Nielsen (22-02-2004)
Kommentar
Fra : Jakob Nielsen


Dato : 22-02-04 21:59

> Nu er DCT en del af jpeg standarden, så det vil være dumt at bruge en dft
i
> stedet

Ja, hvis man vil følge filformatet præcis. Der er dog intet i vejen for at
bruge en DFT til analysen istedet for DCT, så længe man ikke giver data til
nogen som forventer andet.

<snip forklaring>
> det vil sige du vil have max i DCT[200].

Ser man det. Jeg havde egentlig en ide om at der var en 1 til 1
korspondence, så index var lig frekvens. Kan se at det var lidt naivt.
Takker for svaret



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste