目录
在硬件调试初期时,通常需要对ADC采样的信号质量进行一些列分析,可以利用强大的数学工具MATLAB对信号质量进行分析,包括时域绘图、频域绘图、功率谱等。
1 单音信号分析
通常在ADC测试时,会在ADC上输入一个单音信号,将采集回来的数据进行分析。
使用VIVADO中的ILA将ADC数据采集下来,保存为xxxx.csv文件,保存时所有数据均设置为有符号数,以确保matlab在读取数据时不会报错。如果老版本的Vivado不支持将文件保存为xxx.csv只能保存为xxx.ila文件,这就需要在matlab中现运行解压命令,将.ila文件解压为.csv文件,命令如下:
unzip('C:/xxxx/xxxxx/xxxx.ila')
如果ADC采样的数据不是有符号数,而是偏移二进制则需要使用如下明明进行转换:
yt = bin2dec(num2str(csvread(csv_file,srow,scol,[srow,scol,erow,ecol])));
下面给出完成代码:
%%%%%%%%%偏移二进制分析%%%%%%%%%
clc;
clear;
close all;
fclose('all');
format long g
%%unzip('C:/xxx/xxx/adc_data.ila') %解压ILA文件 需要时打开
%% 设置CSV文件读取范围
srow = 2; %起始行(行标从0开始);
scol = 3; %起始列(列标从0开始);
erow = 16384; %结束行(一般为采样深度);
ecol = 3; %结束列;
%% 获取csv文件
[filename, pathname] = uigetfile('C:/Users/57803/Desktop/fft/waveform.csv','读取数据');
csv_file = [pathname filename];
yt = bin2dec(num2str(csvread(csv_file,srow,scol,[srow,scol,erow,ecol])));
yt(yt>=2^13) = yt(yt>=2^13) - 2^14; %偏移二进制转有符号数
figure(1)
subplot(2,1,1);
plot(yt);
title('时域');
yi = bin2dec(num2str(csvread(csv_file,srow,scol,[srow,scol,erow,ecol])));
yi(yi>=2^13) = yi(yi>=2^13) - 2^14;
subplot(2,1,2);
yi = mag2db(abs(fft(yi)));
yi = yi - 80 - 70 +4 -15;
plot(yi);
title('频域');
yc = bin2dec(num2str(csvread(csv_file,srow,scol,[srow,scol,erow,ecol])));
yc(yc>=2^13) = yc(yc>=2^13) - 2^14;
figure(2)
subplot(1,1,1);
psd(yc);
%%spectrum(yc);
title('功率谱');
%%%%%%%%%%%%%%%有符号数%%%%%%%%%%%%%%%%%%%%
clc;
clear;
close all;
fclose('all');
format long g
%%unzip('C:/xxx/xxx/adc_data.ila') %解压ILA文件 需要时打开
%% 设置CSV文件读取范围
srow = 2; %起始行(行标从0开始);
scol = 3; %起始列(列标从0开始);
erow = 16384; %结束行(一般为采样深度);
ecol = 3; %结束列;
%% 获取csv文件
[filename, pathname] = uigetfile('C:/Users/57803/Desktop/fft/waveform.csv','读取数据');
csv_file = [pathname filename];
yt = csvread(csv_file,srow,scol,[srow,scol,erow,ecol]);
figure(1)
subplot(2,1,1);
plot(yt);
title('时域');
yi =csvread(csv_file,srow,scol,[srow,scol,erow,ecol]);
subplot(2,1,2);
yi = mag2db(abs(fft(yi)));
plot(yi);
title('频域');
yc = csvread(csv_file,srow,scol,[srow,scol,erow,ecol]);;
figure(2)
subplot(1,1,1);
psd(yc);
%%spectrum(yc);
title('功率谱');
2 复数信号分析
有些时候需要对正交两路信号进行分析,两路信号构成一个复数代码如下:
%%%%%%%%%%%%%%%%%%%%%%复数信号%%%%%%%%%%%%%%%%%%%%%
clc;
clear;
close all;
fclose('all');
format long g
%%unzip('C:/xxx/xxxx/adc_data.ila') %解压使用
%% 设置CSV文件读取范围
srow = 1; %起始行(行标从0开始);
scol = 5; %起始列(列标从0开始);
erow = 8192; %结束行(一般为采样深度);
ecol = 5; %结束列;
srow1 = 1; %起始行(行标从0开始);
scol1 = 6; %起始列(列标从0开始);
erow1 = 8192; %结束行(一般为采样深度);
ecol1 = 6; %结束列;
%% 获取csv文件
[filename, pathname] = uigetfile('C:/xxx/xxx/iladata7M.csv','读取数据');
csv_file = [pathname filename];
yi = csvread(csv_file,srow,scol,[srow,scol,erow,ecol]);
yq = csvread(csv_file,srow1,scol1,[srow1,scol1,erow1,ecol1]);
figure(1)
subplot(3,1,1);
plot(yi);
title('时域i');
figure(1)
subplot(3,1,2);
plot(yq);
title('时域q');
yi = csvread(csv_file,srow,scol,[srow,scol,erow,ecol]);
yq = csvread(csv_file,srow1,scol1,[srow1,scol1,erow1,ecol1]);
yc = yi + yq*i;
subplot(3,1,3);
yc = mag2db(abs(fft(yc)));
yc = yc - 137; %%幅度补偿
plot(yc);
title('频域');
yi = csvread(csv_file,srow,scol,[srow,scol,erow,ecol]);
yq = csvread(csv_file,srow1,scol1,[srow1,scol1,erow1,ecol1]);
yc = yi + yq*i;
figure(2)
subplot(1,1,1);
psd(yc);
spectrum(yc);
title('功率谱');