基于CORDIC算法的反正切函数实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%% 运用Cordic Algorithm来进行FM信号的解调
clear all;
close all;
% 以下产生FM信号和I,Q双路预处理信号
% 先得到FM信号sf
% % 画出FM信号的时域和频域图
% 分别和cos,sin相乘
delta_fc=0; %设置频偏
sf_I=sf.*cos(2*pi*(fc+delta_fc)*t);
sf_Q=sf.*sin(2*pi*(fc+delta_fc)*t);
% 通过LPF,滤除2倍频
% 考虑完全理想情况的下的滤波,画出预处理后的I,Q两路波形
s_I=sf_I-0.5*A*cos(4*pi*fc*t+2*pi*delta_fc*t+sm);
s_Q=sf_Q-0.5*A*sin(4*pi*fc*t+2*pi*delta_fc*t+sm);
% 以下为Cordic求atan,以及求atan之后的差分结果(FM解调结果)
for i=1:32768
xx(1)=s_I(i);
yy(1)=s_Q(i);
zz(1)=0;
% 进行第一次j=0的迭代
if(yy(1)>=0)
delta1_temp=-1;
else
delta1_temp=1;
end
xx(2)=xx(1)-delta1_temp*yy(1)*2^(-(0));
yy(2)=yy(1)+delta1_temp*xx(1)*2^(-(0));
zz(2)=zz(1)-delta1_temp*atan(2^(-(0)));
% 进行第二次j=0的迭代
if(yy(2)>=0)
delta2_temp=-1;
else
delta2_temp=1;
end
xx(3)=xx(2)-delta2_temp*yy(2)*2^(-(0));
yy(3)=yy(2)+delta2_temp*xx(2)*2^(-(0));
zz(3)=zz(2)-delta2_temp*atan(2^(-(0)));
x(1)=xx(3);
y(1)=yy(3);
z(1)=zz(3);
% 从n=0开始的迭代,n=0,1,2,....
for j=1:16
if(y(j)>=0)
delta(j)=-1;
else
delta(j)=1;
end
x(j+1)=x(j)-delta(j)*y(j)*2^(-(j-1));
y(j+1)=y(j)+delta(j)*x(j)*2^(-(j-1));
z(j+1)=z(j)-delta(j)*atan(2^(-(j-1)));
end
fm_out(i)=z(17);
end
figure;
plot(fm_out);
grid on;
zoom xon;
title('Cordic算的atan时域结果');
figure;
n=length(fm_out);
plot((0:n-1)/n*fs,abs(fft(fm_out)));
grid on;
zoom xon;
title('Cordic算的atan频域结果');
% %%%微分来求fm信号%%%%%%%%%%%%%%
for i=1:32767
fm_result(i)=fm_out(i+1)-fm_out(i);
end
% % 画出解调信号的时域和频域图
% 用Cordic扩展算法来实现FM解调的优缺点
% 优点:1.极大的扩展了动态范围,对于窄带FM信号,可以解调,对于kf<=3的宽带FM信号也能够解调
% 2.避免了叉积鉴频等算法中需要做的相除运算,因为相除在FPGA中实现起来比较麻烦
% 缺点:做I,Q两路相乘的时候,不能有频偏