matlab中用到的与FPGA有关的数据处理的一些方法

一、正弦信号的产生与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位二进制所表示的有符号数的范围。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值