当前位置:   article > 正文

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

matlib计算adcsnr

1、原数据形式

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

2、 读取数据

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

3、画图函数

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

4、参数测量

  1. %%
  2. %参数测量
  3. n = length(realdata);
  4. w = kaiser(n, 38);
  5. rbw = enbw(w, fs);
  6. [Pxx, F] = periodogram(realdata(:,1), w, n, fs, 'psd');
  7. Pxx = 10*log10(Pxx*rbw);
  8. [max_value, max_index] = max(Pxx); %求最大功率点与最大功率
  9. [min_value, ~] = min(Pxx); %求最小功率点与最小功率
  10. s_Fund = max_value; %Fund :dB Fs
  11. s_nsd = min_value - max_value; %NSD :dBc
  12. [r, harmPow, harmFreq] = thd(realdata(:,1),fs,5);
  13. s_hd2 = harmPow(2) - harmPow(1); %HD2 :dBc
  14. s_hd3 = harmPow(3) - harmPow(1); %HD3 :dBc
  15. s_hd4 = harmPow(4) - harmPow(1); %HD4 :dBc
  16. s_hd5 = harmPow(5) - harmPow(1); %HD5 :dBc
  17. sumharmPow = 0;
  18. for i =2: 5
  19. sumharmPow = sumharmPow + 10^(0.1*harmPow(i));
  20. end
  21. s_thd = 10*log10((10^(0.1*harmPow(1)))/sumharmPow);%THD :dBc, THD = 10*log(S/D),S为信号功率,D为杂波功率
  22. temp = Pxx(max_index-5:max_index + 5);
  23. Pxx(max_index-5:max_index + 5) = min_value;
  24. [next_max_value, next_max_index] = max(Pxx);
  25. Pxx(max_index-5:max_index + 5) = temp;
  26. s_next_supr = next_max_value - max_value; %Next Supr:dBc
  27. s_sfdr = - s_next_supr; %SFDR: dBc
  28. s_sinad = sinad(realdata(:,1),fs); %SINAD: dBc
  29. s_enob = (s_sinad - s_Fund - 1.76)/6.02; %ENOB: Bits
  30. s_snr = snr(realdata(:,1), fs); %SNR: dBc
  31. %控制台输出
  32. disp(['SNR:' num2str(s_snr) ' dBc']);
  33. disp(['SFDR:' num2str(s_sfdr) ' dBc']);
  34. disp(['THD:' num2str(s_thd) ' dBc']);
  35. disp(['SINAD:' num2str(s_sinad) ' dBc']);
  36. disp(['ENOB:' num2str(s_enob) ' Bits']);
  37. disp(['Fund.:' num2str(s_Fund) ' dBc']);
  38. disp(['Next supr:' num2str(s_next_supr) ' dBc']);
  39. disp(['HD2:' num2str(s_hd2) ' dBc']);
  40. disp(['HD3:' num2str(s_hd3) ' dBc']);
  41. disp(['HD4:' num2str(s_hd4) ' dBc']);
  42. disp(['HD5:' num2str(s_hd5) ' dBc']);
  43. disp(['NSD:' num2str(s_nsd) ' dBc']);

5、自动滤波,带宽5MHZ

  1. function outlo = filter_my(data,fs,f_max,BW)
  2. %滤波函数
  3. %data:数据
  4. %fs:采样率
  5. %f_max:中心频率点
  6. %BW:带宽
  7. Fs = fs/1e6;
  8. N = 128; %滤波器阶数
  9. Fc1 = f_max - BW/2; %%自适应通带
  10. Fc2 = f_max + BW/2;
  11. flag = 'noscale';
  12. win = hamming(N+1); %窗函数
  13. blo = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag); %滤波器
  14. outlo = filter(blo,1,data);

6、结果图展示

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

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

 控制台参数测量输出

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/782977
推荐阅读
相关标签
  

闽ICP备14008679号