您的位置:首页 > 编程语言 > Python开发

数字混频器python仿真

2015-03-12 23:30 295 查看
在数字滤波器的MATLAB与FPGA实现中,作者用MATLAB定点仿真了混频器(Mixer)的波形图。由于最近在熟练python的使用,花了点时间,把该程序用python跑了出来。两种语言略有区别,所以代码上也会有一些不同。

基本原理是两个sine函数相乘后,频率会搬移,形成DC分量以及更高的频率分量。在程序中,也仿真了没有滤除DC分量时的情况。可以看出,量化比特对于性能的影响很明显。下面分别是量化比特为2和量化比特位10的时候的仿真图。





-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





代码如下:

from __future__ import division
from pylab import *

#system parameter
fi = 625000     #input signal frequency
fo = 625000     # local oscillator
Fs = 5000000    #sampling frequency
L = 1024		# data length
N = 10	# quantization bit

t = linspace(0,1/Fs*L,L)
theta = 2*pi*rand()		# random phase
si = sin(2*pi*fi*t + theta)	#input sine wave
so = sin(2*pi*fo*t)		# local oscillator
sm = si * so		# ideal without quantization loss
sm_no_dc = sm - mean(sm)	#reduce DC component

si = (si * (2**(N-1))).round()	#quantization
so = (so * (2**(N-1))).round()
sm_loss = si * so 	# with loss
sm_loss_no_dc = sm_loss - mean(sm_loss)	# - DC

#normalization
si = si / max(abs(si))
so = so / max(abs(so))
sm = sm / max(abs(sm))
sm_loss = sm_loss / max(abs(sm_loss))
sm_loss_no_dc = sm_loss_no_dc / max(abs(sm_loss_no_dc))
#calculate FFT and normalization
# with DC component
f_sm = fft(sm,L)
f_sm = f_sm / max(abs(f_sm))
f_sm = concatenate([f_sm[L/2:],f_sm[0:L/2]],0)
f_sm_loss = fft(sm_loss,L)
f_sm_loss = f_sm_loss / max(abs(f_sm_loss))
f_sm_loss = concatenate([f_sm_loss[L/2:],f_sm_loss[0:L/2]],0)

# calculate FFT, DC component filtered out
f_sm_no_dc = fft(sm_no_dc,L)
f_sm_no_dc = f_sm_no_dc / max(abs(f_sm_no_dc))
f_sm_loss_no_dc = fft(sm_loss_no_dc,L)
f_sm_loss_no_dc = f_sm_loss_no_dc / max(abs(f_sm_loss_no_dc))

# picture
axis = arange(-L/2,L/2,1)*Fs/L*(10**(-6))
fig,ax = subplots(2,2)
ax[0,0].set_title("%d bit quantization" %N)
ax[0,0].plot(axis,f_sm)
ax[0,0].set_xlabel(r'frequency without quantization')
ax[0,1].plot(axis,f_sm_loss)
ax[0,1].set_title("Frequency Amplitude")
ax[0,1].set_xlabel(r'frequency with quantization')
ax[1,0].plot(axis,f_sm_no_dc)
ax[1,0].set_xlabel(r'No quant and DC')
ax[1,1].plot(axis,f_sm_loss_no_dc)
ax[1,1].set_xlabel(r'quantization but no DC')

t = t * (10**6)
fig1,ax1 = subplots(2,2)
ax1[0,0].set_title("%d bit quantization" %N)
ax1[0,0].plot(t[1:32],si[1:32])
ax1[0,0].set_xlabel(r'input sine')
ax1[0,1].plot(t[1:32],sm[1:32])
ax1[0,1].set_title("Time Wave")
ax1[0,1].set_xlabel(r'mix sine no loss')
ax1[1,0].plot(t[1:32],sm_loss[1:32])
ax1[1,0].set_xlabel(r'mix sine quantization loss')
ax1[1,1].plot(t[1:32],sm_loss_no_dc[1:32])
ax1[1,1].set_xlabel(r'quantization but no DC')
show()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: