日日行,不怕千万里;时时学,不怕千万卷
分类:
2008-01-11 11:11:36
对于线性调频信号,采用的是频率累加器和相位累加器的方式实现的,在FPGA里面涉及到二次函数的累加实现,在此问题的背景下,专门研究了三次函数及三次函数以下的累加器的实现方式,用matlab的方式来仿真,并编写了相关的代码,对于FPGA的程序只要仿照这个过程来做就行,比较简单,这里就不给出了,matlab的程序如下:
%% 使用加法器和累加器实现y=a*x^3+b*x^2+c*x+d %该m文件实现了三次及三次一下的逼近算法 %相对误差可以达到为0的程度 %针对没有乘法器的情况的设计 %例如可以用在线性调频的DDS设计中 clear all clc %% 一次函数的累加实现y=k*x k=1; %函数系数 a(1:1:50)=0; a(1)=k; for i=2:1:50 a(i)=a(i-1)+k; end figure(1) plot(a) %% 二次函数的累加实现 y=0.5*k*x^2 b(1:1:50)=0; k=1; %函数系数 b(1)=k-0.5*k; %初值 for i=2:1:50 b(i)=b(i-1)+k; end c(1:1:50)=0; c(1)=b(1); for i=2:1:50 c(i)=b(i)+c(i-1); end i=1:1:50; d=0.5*k*(i.*i); figure(2) stem(c,'*'); %累加值 hold on plot(d,'r'); %函数本身 hold on m=d-c; plot(m,'y') %相对误差 %% 三次函数的累加器实现 y=1/6*k*x^3 e(1:1:50)=0; k=3; %函数系数 e(1)=0; for i=2:1:50 e(i)=e(i-1)+k; end f(1:1:50)=0; f(1)=1/6*k; %初值 for i=2:1:50 f(i)=f(i-1)+e(i); end g(1:1:50)=0; g(1)=f(1); for i=2:1:50 g(i)=g(i-1)+f(i); end figure(4) stem(g,'*') %累加值 i=1:1:50; h=1/6*k*(i.*i.*i); %函数本身 hold on plot(h,'r') hold on l=g-h; %相对误差 plot(l,'y') |
上面的逼近方法可以达到很高的精度,对于二次,没有误差,三次函数视系数k而变化,不过误差在10的-12次放的级别,可以忽略不计。