STM32
直播中

幽默

9年用户 807经验值
擅长:362163
私信 关注
[问答]

怎样去使用Matlab读取TXT数据文件并做FFT分析呢

怎样去使用matlab读取TXT数据文件并做FFT分析呢?其运行结果是怎样的呢?

回帖(1)

吴纯英

2021-11-19 09:50:55
  Porject_Kiwi
  离线式数字信号处理(一)
  使用Matlab读取TXT数据文件并做FFT分析
  在我群项目Project_Kiwi中,LTC2208的评估已经圆满完成,现在开始下一步的工作。
  今天要来测试的,是使用matlab对数据进行简单处理。
  因为考虑到目前FPGA到PC的数据链路仍然还没有搭建,所以暂时先搭建一个离线式测试平台。等待我们的算法逐渐完整,可以正常运行时,再来调试其到PC的链路,可能是USB,甚至可能是PCIE(先画个饼)
  萌新起步,大佬勿喷。
  第一步的想法是使用SD卡来存取采集的数据,使用FATFS可以迅速在各种平台移植(STM32等ARM平台),SD卡也可以存储大量的数据,随后可以接入电脑使用matlab等工具对数据进行读取并作进一步的处理。
  为了测试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:OneDriveProjectMathWorks1_helloworld_fftsin_data_dec.txt’,‘w’); %把数据写入sin_data.txt文件中,如果没有就创建该文件
  for k=1:length(y_n)
  tb=y_n(k);
  fprintf(fid,‘%d’,tb);
  fprintf(fid,‘rn’);
  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:OneDriveProjectMathWorks1_helloworld_fftsin_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)|’);
  运行结果如图:
  
  可以在单边幅度谱中看到我们刚才生成的500Hz、800Hz、5MHz的三个峰值。
  
  以上desu。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分