Visuelles Debuging der WAV-Player Software

Bei den ersten Tests hatte das Ausgangssignal eine hörbare, sehr sonderbar klingende Verzerrung. Eine Ausgabe der von Little auf Big-Endian konvertierten Samplewerte auf dem Terminal und anschliessende Visualisierung der Daten zeigte folgendes: Immer wenn das 8. Bit gesetzt ist, sind alle höherwertigen Bits auch gesetzt.
Besonders deutlich wurde dies sichtbar anhand einer Datei einer sehr tieffrequenten Sägezahnwelle.
Es stellte sich heraus, dass bei der arithmetischen Rechtsschiebeoperation das höchstwertige bzw. 8. Bit immer kopiert wurde. Dies führte zu folgender Codeänderung:

tmp = inBuffer[idx2][idx*2] << 8; 
tmp |= (inBuffer[idx2][idx*2] >> 8) & 0x00FF;

Durch die Maskierung mit dem Wert 0x00FF werden die fälschlicherweise mitkopierten Bits gelöscht.

Weitere Recherchen haben ergeben, dass es sich bei der Operation um einen arithmetischen, und nicht wie gewünscht um einen logischen Shift handelt. Der arithmetische Shift kommt in der Hochsprache C automatisch dann zum Zuge, wenn er auf mit Vorzeichen behaftete Variablen angewendet wird.

 

 

 

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.