A szinuszos hangminta torzítása
A hanggenerátor programban előállított szinuszos hangminta semmilyen extra fogást nem tartalmazott, középiskolai matematikai ismeretek elegendőek hozzá. Foglalkoztatott azonban a kérdés, hogy lehetne-e jobb, kisebb torzítású jelet előállítani. Két irányban próbáltam tapogatózni:
- Egyrészt a programban használt lebegőpontos változók típusait vettem sorra. A Delphi 4 féle ilyen változóval rendelkezik: Single (4 byte), Real48 (6 byte), Double (8 byte) és Extended (10 byte).
- Másrészt, a tört-egész átalakítást három féle módon próbáltam: csonkítás, kerekítés, zajmoduláció (dithering).
A programban kiszámolt hangmintát 2 mp hosszú *.wav formátumban lemezre mentettem, majd a SpectraLAB programmal vizsgáltam (FFT 65536 pts). Így az analízis tisztán matematika jellegű volt. A 4 változó típus és 3 féle egész képzés adta 12 féle lehetőség torzítási eredményeit táblázatba foglaltam:
|
Csonkítás (Truncate) |
Kerekítés (Round) |
Zajmoduláció (Dithering) |
Single |
0,00108 % |
0,00053 % |
0,00098 % |
Real48 |
0,00163 % |
0,00133 % |
0,00099 % |
Double |
0,00174 % |
0,00133 % |
0,00099 % |
Extended |
0,00174 % |
0,00122 % |
0,00099 % |
A Delphi kódban eredetileg kerekítést alkalmaztam, és sima "Real" típust használtam, ami egyenértékű a "Double" változattal. A kerekítés módszere továbbra is megmaradt, de a változó típusa "Single" lett. Ezzel a fogással 0,00133 % helyett csupán 0,00053 % lett a hangminta torzítása.
Tapasztaltam egy érdekességet, miszerint a tört-egész átalakításnál, ha zajmodulációt alkalmazok, változik a spektrum képe is. A "Single" típus három módon történő egész képzése adta spektrum:
