数字混频器python仿真
2015-03-12 23:30
295 查看
在数字滤波器的MATLAB与FPGA实现中,作者用MATLAB定点仿真了混频器(Mixer)的波形图。由于最近在熟练python的使用,花了点时间,把该程序用python跑了出来。两种语言略有区别,所以代码上也会有一些不同。
基本原理是两个sine函数相乘后,频率会搬移,形成DC分量以及更高的频率分量。在程序中,也仿真了没有滤除DC分量时的情况。可以看出,量化比特对于性能的影响很明显。下面分别是量化比特为2和量化比特位10的时候的仿真图。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
代码如下:
基本原理是两个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()
相关文章推荐
- Python 起步:数据类型一数字
- 一个python小程序,从文本文件中读取每行的两组数字,进行排序后输出.
- 数字光纤通信系统仿真软件的研究
- python的数字赋值
- Python笔记——数字及数学函数
- Python入门学习之---------Python数字表达式和输出
- Python 调用CAPICOM 读取 USB-KEY数字证书
- python判断unicode是否是汉字,数字,英文,或者其他字符
- python 数字练习
- 用Python来在IP地址和数字之间转换
- python:ip地址转换到数字
- Python Cookbook 1.2 字符与数字的相互转换
- Python 字符串 转换 整数 浮点数 数字
- Python and django(四)--详解python中的数字和序列
- Python Cookbook 第二版 汉化版 [Recipe 1.2] 字符与其对应的数字编码之间的转换
- 用python 找到不存在的数字
- 博客园仿真足球竞赛平台Python版SDK
- python字符串与数字的转化
- python 数字相关