Der effizienteste Weg, eine 32-Bit-Ganzzahl in einen 16-Bit-Wert umzuwandeln?C++

Programme in C++. Entwicklerforum
Guest
 Der effizienteste Weg, eine 32-Bit-Ganzzahl in einen 16-Bit-Wert umzuwandeln?

Post by Guest »

Ich schreibe einen DSP-Code, der eine Wellenfaltungsverzerrung an einem Eingangssignal durchführt. Dieser Code wendet eine Amplitudenverstärkung an (multipliziert die Eingabe mit einem Verstärkungswert) und faltet dann die Eingabe so, dass der endgültige Amplitudenbereich -32768 bis 32767 beträgt (-1 bis ~1 im 16-Bit-Festkomma-Audioformat). Werte über 32767 werden auf -32768 umgebrochen und umgekehrt.
Wie lässt sich dieser Umbruchvorgang am effizientesten durchführen? Ich habe es zufällig auf STM32-Hardware entdeckt, wo 16-Bit-Werte automatisch übertragen wurden, wenn große Verstärkungswerte angewendet wurden, aber diese Version ist für die Ausführung auf anderer Hardware (NXP) gedacht und ich möchte absichtlich die Kontrolle darüber haben, was ich möchte. Ich tue es, anstatt mich auf eine schlecht dokumentierte Nebenwirkung zu verlassen. Ich möchte auch, dass dies so effizient wie möglich ist und gleichzeitig der Code in C bleibt, da es sich um einen Echtzeit-DSP-Prozess handelt und daher laufzeitkritisch ist.
Bitte lassen Sie mich wissen, welchen Ansatz Sie TIA vorschlagen würden !
Im Anhang finden Sie einen Codeausschnitt, der einen ersten Ansatz zeigt und zeigt, was erreicht werden soll. Ich glaube nicht, dass die Verwendung der while-Schleife sehr effizient sein dürfte. Ich würde dies gerne verbessern, um eine bessere Methode zu verwenden:

Code: Select all

void wavefolding_distortion::update(void)
{
audio_block_t *block = receiveWritable(0);

if(block){
for (int i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
int32_t in = block->data[i];

in *= gain;

while(in > 32767){
in -= 65536;
}

while(in < -32768){
in += 65536;
}

block->data[i] = in;
}
transmit(block);
release(block);
}

}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post