2016-11-20 64 views
1

我想將浮點數sin值轉換爲固定點值。在Python中將浮點數轉換爲固定點

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) 

我如何可以輕鬆地將這個y浮點點樣品到定點樣?

每個元素應該是16位和1位整數部分,15位應該是小數部分,以便我可以將這些採樣傳遞給DAC芯片。

+1

將每個y項乘以2 ** 15轉換爲Q15。對於請求的表達式,您不能表示值1。 – omegatre

+0

是的,您是儀式,可能是最高的+ ve值是0.999 .... dac輸入除了Q1.15的2的補碼值.... –

+0

正如所述omegatre,您無法用請求的定點格式表示值1。所以我建議每乘以y(2 ** 15 - 1)以避免可能的溢出。 – maniacmic

回答

0

若要將樣本從float轉換爲Q1.15,請將樣本乘以2 ** 15。但是,正如評論中所述,由於LSB代表符號,因此您不能在Q1.15中代表1.0。因此,您應該將您的值限制在[-1, MAX_Q1_15]的範圍內,其中MAX_Q1_15 = 1.0 - (2 ** -15)。這可以通過一些有用的numpy功能來完成。

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

雖然你可能會擔心這表示並不準確地代表1.0的價值,它是足夠接近做計算用。例如,如果你方1.0

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

非常接近,有1位錯誤。

希望它有幫助。