利用定点式工具箱实现:文件读取,完成不同进制之间的转换

在进行一些大的算法编程时,经常会遇到处理一些大量的数据,而这些数据存储的格式却各不相同,
如DSP和FPGA中用到的是16进制表示的,而matlab中运算得到的是十进制,在不同的软件中执行
要用各自允许的格式,有时转换起来非常麻烦。
下面是我在实践中用matab处理十进制数据和十六进制数据之间的转换技巧,分享如下:
1、十进制转换成其它进制
t = fi(0,1,23,22); //严格的使用格式是fi(var,sign,wordlength,fractionwordlength),sign处的值为1或0, 1为有符号数,0为无符号数
t.data = var; //var 为变量名,可以是一个数,也可以是一个数组,一个数据文件中的变量
coef=t.hex; //将var的值转换成16进制后赋给coef
fc=strcat(‘0x’,coef);//这是将前缀加进去
对上面进行相应的改动
就可以实现转换成2进制和八进制的数
如:coef=t.bin //二进制
coef=t.oct //八进制
当然,首先要确定你的数据范围是多少,用多少位来表示,多少整数位,多少分数位
结果才不会出错

for example:
>> var=0.5;
>> t = fi(0,1,16,15);
t.data = var;
coef=t.hex 
fc=strcat('0x',coef)
运行结果如下:
coef =
4000
fc =
0x4000 

2、其他进制转换为十进制
现在介绍如何将一个DSP和FPGA中产生的hex格式的数据读入到matlab中,
并转换成10进制,进行一些分析和信号处理操作,然后再转换成hex格式,
从而来指导DSP和FPGA进行相应的信号处理工作

Ts=1/50e6;
fid = fopen('test.txt');
test = fscanf(fid, '%s\n'); 
tt = fi(0,1,16,15);
x1 = zeros(1,length(test)/4);
for i = 1:length(test)/4
tt.hex = test((4*i-3):4*i);
x1(1,i)=tt.data;
end

x=x1(1:n); %n为付立叶变换的点数,是2的幂,一般取5121024

%***************1.正弦波****************%
fs=50e6;%设定采样频率
N=1024;
n=0:N-1;
t=n/fs;
figure(1);
subplot(211);
plot(1:length(x),x,'b');%作输入信号的时域波形
%stem(x);
hold on;
xlabel('t');
ylabel('x');
title('输入信号x时域波形');
grid on;


%进行FFT变换并做频谱图
y=fft(x,N);%进行fft变换
mag=abs(y)*2/N;%求幅值
f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换
figure(1);
subplot(212);
plot(f,mag,'b');%做频谱图
hold on;
xlabel('频率(Hz)');
ylabel('幅值');
title('输入信号x幅频谱图N=1024');
grid;

转自MATLAB中文论坛

猜你喜欢

转载自blog.csdn.net/tusiji5286/article/details/106805288