MATLAB-读取csv表格(含ADC采样数据),测量SNR、SFDR、THD、SINAD、ENOB、ENOB、Fund、Nextsupr等参数,并对信号进行自动滤波

1 篇文章 0 订阅
1 篇文章 0 订阅

1、原数据形式

有IQ两路,16位量化,采样率80MHz

2、 读取数据

%读取数据
filename = 'iladata.csv';                   %文件地址
data = csvread(filename,2,0);               %读取csv文件

3、画图函数

function [fbj] = figurePlot(realdata, fs)
%   figurePlot画图函数
%realdata:数据
%fs:采样率
[~,harmpow,harmfreq] = thd(realdata(:,2),fs,5);                 %调用thd分析函数
fbj = figure;
thd(realdata(:,1),fs,5);
hold on;
%标注谐波
for i = 1:5
    text(harmfreq(i)/1e6,harmpow(i) + 10,num2str(harmfreq(i)/1e6),'Color','red');
end
ylabel('dB Fs');                                                %标注y轴
ylim auto                                                       %标注x轴
title('');
end

4、参数测量

%%
%参数测量
n = length(realdata);
w = kaiser(n, 38);
rbw = enbw(w, fs);
[Pxx, F] = periodogram(realdata(:,1), w, n, fs, 'psd');
Pxx = 10*log10(Pxx*rbw);

[max_value, max_index] = max(Pxx);          %求最大功率点与最大功率
[min_value, ~] = min(Pxx);                  %求最小功率点与最小功率
s_Fund = max_value;                         %Fund :dB Fs
s_nsd = min_value - max_value;              %NSD :dBc
[r, harmPow, harmFreq] = thd(realdata(:,1),fs,5);
s_hd2 = harmPow(2) - harmPow(1);            %HD2 :dBc
s_hd3 = harmPow(3) - harmPow(1);            %HD3 :dBc
s_hd4 = harmPow(4) - harmPow(1);            %HD4 :dBc
s_hd5 = harmPow(5) - harmPow(1);            %HD5 :dBc

sumharmPow = 0;
for i =2: 5
    sumharmPow = sumharmPow + 10^(0.1*harmPow(i));
end
s_thd = 10*log10((10^(0.1*harmPow(1)))/sumharmPow);%THD :dBc, THD = 10*log(S/D),S为信号功率,D为杂波功率

temp = Pxx(max_index-5:max_index + 5);
Pxx(max_index-5:max_index + 5) = min_value;
[next_max_value, next_max_index] = max(Pxx);
Pxx(max_index-5:max_index + 5) = temp;
s_next_supr = next_max_value - max_value;           %Next Supr:dBc
s_sfdr = - s_next_supr;                             %SFDR: dBc

s_sinad = sinad(realdata(:,1),fs);                  %SINAD: dBc
s_enob = (s_sinad - s_Fund - 1.76)/6.02;            %ENOB: Bits
s_snr = snr(realdata(:,1), fs);                     %SNR: dBc


%控制台输出
disp(['SNR:' num2str(s_snr)  ' dBc']);
disp(['SFDR:' num2str(s_sfdr)  ' dBc']);
disp(['THD:' num2str(s_thd)  ' dBc']);
disp(['SINAD:' num2str(s_sinad)  ' dBc']);
disp(['ENOB:' num2str(s_enob)  ' Bits']);
disp(['Fund.:' num2str(s_Fund)  ' dBc']);
disp(['Next supr:' num2str(s_next_supr)  ' dBc']);
disp(['HD2:' num2str(s_hd2)  ' dBc']);
disp(['HD3:' num2str(s_hd3)  ' dBc']);
disp(['HD4:' num2str(s_hd4)  ' dBc']);
disp(['HD5:' num2str(s_hd5)  ' dBc']);
disp(['NSD:' num2str(s_nsd)  ' dBc']);

5、自动滤波,带宽5MHZ

function outlo = filter_my(data,fs,f_max,BW)
%滤波函数
%data:数据
%fs:采样率
%f_max:中心频率点
%BW:带宽


Fs = fs/1e6;  
N    = 128;        %滤波器阶数
Fc1  = f_max - BW/2;   %%自适应通带   
Fc2  = f_max + BW/2;      
flag = 'noscale';  

win = hamming(N+1);             %窗函数

blo  = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);    %滤波器

outlo = filter(blo,1,data);


6、结果图展示

原始数据频谱分析与参数测量 

滤波后数据频谱分析与参数测量 

 控制台参数测量输出

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值