离线式数字信号处理(一)—— 使用Matlab读取TXT文件并做FFT分析

Porject_Kiwi

离线式数字信号处理(一)

使用Matlab读取TXT数据文件并做FFT分析

在我群项目Project_Kiwi中,LTC2208的评估已经圆满完成,现在开始下一步的工作。
今天要来测试的,是使用matlab对数据进行简单处理。
嘿嘿嘿
因为考虑到目前FPGA到PC的数据链路仍然还没有搭建,所以暂时先搭建一个离线式测试平台。等待我们的算法逐渐完整,可以正常运行时,再来调试其到PC的链路,可能是USB,甚至可能是PCIE(先画个饼)

萌新起步,大佬勿喷。

第一步的想法是使用SD卡来存取采集的数据,使用FATFS可以迅速在各种平台移植(STM32等ARM平台),SD卡也可以存储大量的数据,随后可以接入电脑使用matlab等工具对数据进行读取并作进一步的处理。

SD卡
STM32, FPGA
PC

为了测试matlab程序,我们需要先生成一个.txt文件,STM32的程序已经叫学弟在写了,我们先用Matlab生成一个先跑着。(学弟好像还在调车)
我的程序基于这位大佬的程序进行轻微修改

%=============设置系统参数==============%
f1=5e6;        %设置波形频率
f2=500e3;
f3=800e3;
Fs=40e6;        %设置采样频率
L=2048;         %数据长度
N=8;           %数据位宽
%=============产生输入信号==============%
t=0:1/Fs:(1/Fs)*(L-1);
y1=sin(2*pi*f1*t);
y2=sin(2*pi*f2*t);
y3=sin(2*pi*f3*t);
y4=y1+y2+y3;
y5 = y4 + 1*randn(size(t));
y_n=round(y5*(2^(N-3)-1));      %N比特量化;如果有n个信号相加,则设置(N-n)
%=================画图==================%
a=10;           %改变系数可以调整显示周期
%stem(t,y_n);
plot(t,y_n);
axis([0 L/Fs/a -2^N 2^N]);      %显示
%=============写入外部文件==============%
fid=fopen('D:\OneDrive\Project\MathWorks\01_helloworld_fft\sin_data_dec.txt','w');    %把数据写入sin_data.txt文件中,如果没有就创建该文件  
for k=1:length(y_n)
    tb=y_n(k);
    fprintf(fid,'%d',tb);
    fprintf(fid,'\r\n');
end

fprintf(fid,';');
fclose(fid);

修改了一下采样频率,到40Msps,修改数据宽度到2048获取更多的采样点。图形绘制修改成plot函数,这样画出来的图会好看些。因为原本是在vivado仿真运行的,所有的数据被储存成了14位BIN格式,修改成了DEC,方便观察数据和matlab读取。而且考虑到后期我们的程序直接运行在PS内部,也不需要存储成二进制数,方便了数据处理。
程序中还使用用均值为零、方差为 1 的白噪声扰乱该信号。以此来观察FFT。

运行结果如图所示
运行结果
运行得到的TXT文件如图。
结果
好了,现在我们有了测试用的TXT文件,就可以开始运行处理程序了。
目前处理程序还非常的简陋,之后会继续往里面添加更多的东西。

%读取txt格式的波点数据到数组并绘图

%信号的参数
Fs = 40e6;            % 采样频率               
T = 1/Fs;             % 采样周期(周期=1/频率) 
L = 2048;             % 信号长度,2048
t = (0:L-1)*T;        % 时间向量

wave_data=importdata('K:\OneDrive\Project\MathWorks\01_helloworld_fft\sin_data_dec.txt');
subplot(2,1,1);plot(wave_data) ;
Y = fft(wave_data);


P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;

subplot(2,1,2);plot(f,P1) ;
title('X(t)单边幅度频谱');
xlabel('f (Hz)');
ylabel('|P1(f)|');

运行结果如图:
结果2
可以在单边幅度谱中看到我们刚才生成的500Hz、800Hz、5MHz的三个峰值。
在这里插入图片描述
以上desu。

猜你喜欢

转载自blog.csdn.net/qq_36470569/article/details/106798915