Verfasst: So 14. Nov 2004, 16:21
Sinnvoller Ansatz ist:WeSiSteMa hat geschrieben:Hi burki.
Hab schon auf dich gewartet. :lol:Wir haben auch zwei völlig unterschiedliche Dinge gemacht.burki hat geschrieben:Mein Ergebnis: kein Unterschied hoerbar, egal ob 88,2/24 oder 44,1/16.
Wie in meinem Text schon beschrieben, hab ich Wert darauf gelegt, nur mit der höchstmöglichen Auflösung zu testen, um keine Fragen offen zu lassen ob vieleicht ja doch ...
Dann habe ich nichts resampled, sondern eine analoge Quelle benutzt, die ich mit zwei verschiedenen Auflösungen digitalisiert habe. Du kannst mir glauben: Es ist ein Unterschied zu hören! Die einzige Möglichkeit, mich davon abzubringen, wäre mir einen methodischen Fehler nachzuweisen. Doch nach einem Solchen hab ich selber lange gesucht.
* Analoges Material mit 192 kHz/24 bit digitalisieren oder 192 kHz/24 bit Material besorgen.
* Auf DVD-A-Scheibe 1 direkt draufbrennen (nicht beschriften).
* Das 192 kHz/24 bit-Signal mit hochwertigen Verfahren auf z.B. 44,1 kHz/16 bit umrechnen, dieses 44,1 kHz/16 bit dann wieder zurück nach 192 kHz/24 bit konvertieren.
* Dieses dann auf DVD-A-Scheibe 2 brennen (nicht beschriften).
* Beide Scheiben "mischen", d.h. man darf nicht mehr wissen, was welche ist.
* Scheibe 1 per Hörtest herausfinden.
Hintergründe:
* Scheibe 1 ist eine Aufnahme mit voller Bandbreite und Bittiefe.
* Scheibe 2 ist eine sauber hochgesampelte CD (das Zwischenprodukt 44,1 kHz/16 bit kannst Du auf CD Scheibe 3 brennen), ist den Restriktionen einer CD unterworfen.
* Bei diesem Test nutzt Du die gleichen Wandler, Pegel sind zwangsweise identisch, wenn die DVD-As "ehrlich" gemischt wurden, ist das sogar ein DBT.
* Du kann (für mittlerweile 80 Cent) auch andere Formate als 44,1 kHz/16 bit, z.B. 38,4 kHz/14 bit testen.
Bemerkung:
Man kann von jeder beliebigen Abtastrate fs1 auf jede beliebige fs2 umrechnen. Es treten keine zusätzlichen Fehler auf, wenn fs1 und fs2 nicht in ganzzahligen Verhältnissen stehen.
Z.B. beim Resampling von fs1 auf fs2 = alpha * fs1
* alpha = m: Man benötigt m FIR-Filter (davon kann 1 FIR trivial sein, wenn man auf keine Entzerrung des Analog-Filters benötigt)
* alpha = m/n: Man benötigt m FIR-Filter (davon kann 1 FIR trivial sein, wenn man auf keine Entzerrung des Analog-Filters benötigt und m > n ist)
* alpha = irrational: Hier bekommt man Ärger, wenn man die Filter nicht für jeden Sample neu berechnen möchte.
Für 44,1 => 88,2 kHz benötigt man 2 FIRs, für 88,2 kHz => 44,1 kHz 1 FIR, für 32 kHz => 96 kHz 3 FIRs, für 44,1 kHz => 96 kHz 320 FIRs, von 96 kHz auf 44,1 kHz 147 FIRs. Für DSP vielleicht ein Problem, weil man mehr RAM benötigt, bei PC-CPUs hat man davon ohnehin mehr als man benötigt. Cache-Hit-Rate fällt etwas.
Code sieht etwa so aus (ohne Filterbankberechnung und Quantisierung):
Code: Alles auswählen
unsigned int i ;
unsigned int j ;
unsigned int m ;
unsigned int n ;
unsigned int SourceLength ;
unsigned int FIRlen ;
const float* src ;
float* dst ;
int Offset ;
int Offsets [m] ;
float FIRs [m] [FIRlen] ; // bei Verwendnung von 64 TAPs und m=320 sind das 80 KByte
float FIR [FIRlen] ;
---------- für m=1 ---------------
for ( i = 0; i < SourceLength / n; i++ )
dst [i] = Scalar ( FIR, src + i*n + Offset, FIRlen ) ;
---------- für n=1 --------------
for ( i = 0; i < SourceLength; i++ )
for ( j = 0; j < m; j++ )
dst [i*m + j] = Scalar ( FIRs [j], src + i + Offsets [j], FIRlen ) ;
---------- für beliebiges m, n --------------
for ( i = 0; i < SourceLength / n; i++ )
for ( j = 0; j < m; j++ )
dst [i*m + j] = Scalar ( FIRs [j], src + i*n + Offsets [j], FIRlen ) ;
Code: Alles auswählen
float
Scalar ( const float* A, const float* B, unsigned int len )
// Hier kann man schon SSE-1 bei x86 benutzen
{
double ret = 0. ;
while ( len-- ) ret += *A++ * *B++ ;
return (float) ret ;
}