2016-11-20 3 views
1

Ich möchte Gleitkommawerte in Festkommawerte umwandeln.In Python Gleitkommazahlen in Festkommawerte umwandeln

import matplotlib.pyplot as plt 

import numpy as np 


Fs = 8000 

f = 5 

sample = 8000 

x = np.arange(sample) 

y = np.sin(2 * np.pi * f * x/Fs) 

Wie kann ich diese y Fließkomma-Samples einfach in Festkomma-Samples umwandeln?

Jedes Element sollte aus 16 Bit und 1 Bit Integer-Teil bestehen und 15 Bit sollten einen Bruchteil haben, damit ich diese Abtastwerte an einen DAC-Chip weitergeben kann.

+1

Multiplizieren Sie jedes y-Objekt mit 2 ** 15, um es in Q15 umzuwandeln. Mit der angeforderten Darstellung können Sie nicht den Wert 1 darstellen. – omegatre

+0

ja Sie sind rite, kann der höchste + ve Wert ist 0,999 .... der dac Eingang ausgenommen die 2er Komplement Werte von Q1.15 .... –

+0

Wie erwähnt von omegatre Sie können den Wert 1 nicht mit dem gewünschten Festkommaformat darstellen. Daher empfehle ich, jedes y mit (2 ** 15 - 1) zu multiplizieren, um einen möglichen Überlauf zu vermeiden. – maniacmic

Antwort

0

Um die Proben von float in Q1.15 zu konvertieren, multiplizieren Sie die Proben mit 2 ** 15. Wie in den Kommentaren erwähnt, können Sie jedoch 1.0 in Q1.15 nicht darstellen, da das LSB das Vorzeichen darstellt. Daher sollten Sie Ihre Werte im Bereich von [-1, MAX_Q1_15] wo MAX_Q1_15 = 1.0 - (2 ** -15) klemmen. Dies kann mit ein paar hilfreichen Funktionen geschehen.

y_clamped = np.clip(y, -1.0, float.fromhex("0x0.fffe")) 
y_fixed = np.multiply(y_clamped, 32768).astype(np.int16) 

Obwohl Sie diese Darstellung fürchten nicht genau den Wert von 1.0 darstellen, ist es nahe genug, um die Berechnung zu tun, mit.

fmul_16x16 = lambda x, y: x * y >> 15 
fmul_16x16(32767, 32767) # Result --> 32766 

die sehr nahe ist, mit 1-Bit-Fehlern: Zum Beispiel, wenn Sie 1.0 zum Quadrat sind.

Hoffentlich hilft es.

Verwandte Themen