一、正弦信号的产生与FPGA数据的生成
clear all;
clc;
fs=1e6; %数据采样率1MHz
t=0.002; %采样时长
N=fs*t;%采样点数
tnrn1=(-N/2:N/2-1)/fs; %时间序列
fnrn1=(-N/2:N/2-1)/N*fs; %频率序列
ff1=10e3; %10KHz的正弦信号
ff2=100e3; %100KHz的正弦信号
x=0.5*sin(2*pi*ff1*tnrn1)+0.5*sin(2*pi*ff2*tnrn1); %两种信号的加和
data=round(x*(2^15)); %对数据进行量化位16位二进制
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%将数据转为4位的16进制数
for k=1:2000
if(data(k)>=0)
data_FPGA(k,:)=dec2hex(data(k),4);
else
temp=data(k)+2^16;
data_FPGA(k,:)=dec2hex(temp,4);
end
end
%%%%%%%%%%%%%%%%%%%%%%%将数据保存到文件中,之后由FPGA进行读取
fileID = fopen('sample.txt','w');
formatSpec='%s%s\n';
for m=1:2000
fprintf(fileID,formatSpec,data_FPGA(m,:),' '); %formatSpec中的第一个%s对应的是data_FPGA(m,:),第二个%s对用的是' '
end
fclose(fileID);
注释:其中有一个问题,就是在进行数据量化的时候,到底是乘以(2^15),还是(2^16),还是(2^15-1)。我们可以举个例子,假设原始数据是-1~+1范围内的数(正弦信号的值的范围就是这样的),要将它量化为 4位二进制的数。4位二进制可以表示的无符号的范围是0~15,有符号的范围是-8~7。毫无疑问,我们需要表示成有符号的。那么我们将三个选择带进去,看能得到哪三种范围?乘以(2^3)得到的是-8~8,乘以(2^4)得到的是-16~16,乘以(2^3-1)得到的是-7~7。显然,乘以(2^3-1)才是正确选项。那么上面的代码为什么选择乘以(2^15)?因为这里是两个正弦信号的加和,加和之后的结果的范围并不是-1~+1,在乘以(2^15)之后并没有超过16位二进制所表示的有符号数的范围。