ADC 动态参数分析matlab code的几个问题(span,spanh取值问题,幅度比例因子的添加等)

这篇具有很好参考价值的文章主要介绍了ADC 动态参数分析matlab code的几个问题(span,spanh取值问题,幅度比例因子的添加等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

目前内外网自用ADC动态参数计算的matlab程序都是同一套模板的改版,存在共同的问题,迟迟没有得到解决,也困扰了我几天,不过还好,最终搞明白了几点。


一、ADC动态参数分析的源程序从何而来?

        目前看到的各种文章,很多都可以追溯到2002年的这篇文章:

https://www.maximintegrated.com/en/design/technical-documents/tutorials/7/729.html后面附带的示例程序,大部分改编的文章都是在这个基础上改了数据读出的方式(每个人采集数据的保留格式不同),后面的具体程序几乎没有实质性改变,这也造成了几个问题:

        1,没有交代清楚 signal 的 span 该取,谐波的spanh 该取多少,为什么要使用这个公式,为什么取这个值:

           %Span of the input frequency on each side
           span=max(round(numpt/200),5);

           %Approximate search span for harmonics on each side
           spanh=2;

        2, 没有考虑非满量程下的幅度比例因子的问题,导致程序结果有偏差。

        3,迭代过程中数组可以预设置内存大小,加快计算速度。

二、直接上代码

1.修改后的matlab code

代码如下(示例):

clc
clear

%extract array data from the datasource file  
fileID = fopen('E:\data\matlab\100mV_0912_1.c','r');
[data4,~] =  fscanf(fileID,'%d');
data4 = data4';             %转置数组

numpt = 20000;              %数据点个数(可根据需求调节)
num_bit=12; %               %ADC数据位。(有符号整型数)
fclose(fileID);             %关闭文件

x = 1:1001;                 %作图点数
data100 = data4(1:1001);    %原始波形取作图点数个点
subplot(1,2,1);             %作图 一行 二列 中的第一个小图
plot(x,data100);            %作图,仅作波形示意,和后面的数据处理关系不大

mul=mean(data4);            %求数据平均值,用于后面的数据 正负中心对齐


%span=40;                    %信号频率+ -span范围都算作信号能量
span=max(round(numpt/200),5);%一种经验公式,来自maxim网站源码,基本正确,确实可以涵盖信号带宽                 
spanh=5;                     %谐波频率+ -spanh范围都算作谐波能量,可由小达到实验,ENOB数值稳定后即可
Fsample=125;                 %采样率125M,单位MHz

m=1:numpt;                                  %生成数组

data33=(data4(m)-mul)/(2^(num_bit-1)-1);    %正负中心(基线)对齐,并转化为具体幅度0-1;

                  
                                            % data33,需要做FFT变换的数据,4000个点,必须是连续的周期信号
beta=5.658;                                 %没有使用此变量
data44=data33'.*hanning(numpt);            %加窗,汉宁窗
%data44=data33'.*hamming(numpt);            %加窗,汉明窗
%data44=data33;                              
data55=fft(data44);                         %fft变换
data66=abs((data55));                       %取绝对值,表示信号幅度
data77=20*log10(data66);                    %取对数,分贝
data88=data66.*data66;                      %平方,表示信号能量

max_voltage =  max(abs(data33));            %最大电压值
max_voltagedb = 20*log10(max_voltage/1);    %最大电压分贝
%max_voltagedb = 0;                         %试验不设置为零的时候频谱图形状

bili_factor_1=1/max_voltage;                %幅度比例因子
bili_factor=bili_factor_1^2;                %功率比例因子
%bili_factor=1;                             %测试比例因子为1时参数变化    

maxdb=max(data77(1:numpt/2));               %最大幅值,分贝

x=((0:(numpt/2-1)).*Fsample/numpt);         %x轴,频率单位,Mhz,
y1=data77(1:numpt/2)-maxdb+max_voltagedb;   %y轴,幅值,db,最大0db
figure(1);
subplot(1,2,2)
plot(x,y1);                                 % 作图

fin=find(data77(1:numpt/2)==maxdb);         %输入信号,赋值,找到最大的频率
                                            %  fin=fin+1;
                                            % 如果含直流成分过大,那么fin可能是直流频率
                                            %所以不考虑直流分量

Fh= zeros(1:8);   %谐波频率 数组 预设置内存
Ph= zeros(1:8);   %谐波能量 数组 预设置内存

for har_num=1:8      %1到15次谐波分量
    tone=rem((har_num*(fin)+1)/numpt,1);  
    %各次谐波对应的能量
    if tone>0.5
            tone=1-tone;      %对称
    end
%Fh=[Fh tone]; %旧版本,每次迭代的时候append 数据,速度慢,现改称预设内存大小,根据数组下标赋值
Fh(har_num)=tone;
%谐波,在Fh中加入tone
if round(tone*numpt)-spanh>0
har_peak=max(data88(round(tone*numpt)-spanh:round(tone*numpt)+spanh));%谐波附近+-spanh最大值
har_bin=find(data88(round(tone*numpt)-spanh:round(tone*numpt)+spanh)==har_peak);%最大值对应频率
    har_bin=har_bin+round(tone*numpt)-spanh-1;
    Ph(har_num)=sum(data88(round(tone*numpt)-spanh:round(tone*numpt)+spanh)); 
 %  har_bin-spanh:har_bin+spanh;
else 
har_peak=max(data88(1:round(tone*numpt)+spanh));%谐波附近+-spanh最大值
har_bin=find(data88(1:round(tone*numpt)+spanh)==har_peak); %最大值对应频率
    har_bin=har_bin+round(tone*numpt)-spanh-1;
    Ph(har_num)=sum(data88(1:har_bin+spanh)); %旧版本,每次迭代的时候append 数据,速度慢,现改称预设内存大小,根据数组下标赋值
end
%某谐波分量
end
%你好

Pdc=sum(data88(1:span));                        %直流能量
Ps=bili_factor*sum(data88(fin-span:fin+span));  %信号能量,前后span个都算作信号能量,
Pd=bili_factor*sum(Ph(2:8));                    %谐波能量
Pn=sum(data88(1:numpt/2))-Pdc-Pd/bili_factor-Ps/bili_factor;   
                                                %噪声能量%


fin_MHz=fin/numpt*Fsample;                      %信号频率
SNR=10*log10(Ps/Pn);                            %信噪比
SINAD=10*log10(Ps/(Pn+Pd));                     %信纳比
SFDR=10*log10(Ph(1)/max(Ph(2:8)));              %无杂散动态范围
ENOB=(SINAD-1.76+20*log10(1/max_voltage))/6.02; %幅度校正后有效位

2.代码处理的数据

        代码+数据压缩文件链接https://download.csdn.net/download/qq_38239093/86533881



三、讲解

        1,span、spanh本质都是测出来的

        放大信号的频谱图,测量频谱图信号峰值两边到峰值频率的-3dB带宽的,再除以FFt的Bin宽取整,就得到了span的数值,经过验证,段落一中引用的经验公式,基本可以将信号的能量囊简括在内,保证ADC参数结果基本稳定。

        谐波的范围参数spanh则是试出来的!从最小的正整数1开始,逐渐增加,直到SINAD或者ENOB数值不发生明显变化即可,省去了计算的过程,不过理论是可行的,基本上此数值下,已经囊括了大部分的谐波能量。

        2,整型数据需要中心对齐(recenter),需要转化成幅度,这是源程序没有的,原因是其数据格式已经是代表幅度的浮点数。

        

data33=(data4(m)-mul)/(2^(num_bit-1)-1);    %正负中心(基线)对齐,并转化为具体幅度0-1;

        3,最好根据迭代的次数(根据计算的谐波个数)预设置内存大小,加快运算速度

Fh= zeros(1:8);   %谐波频率 数组 预设置内存
Ph= zeros(1:8);   %谐波能量 数组 预设置内存

        4,比例因子的引入,如代码所示,需要提醒的是最后的ENOB也要考虑到这一点:

ENOB=(SINAD-1.76+20*log10(1/max_voltage))/6.02; %幅度校正后有效位

理论来源:冯雪. ADC动态参数估算算法的优化与实现[D]. 江苏:东南大学,2016. DOI:10.7666/d.Y3142543.ADC 动态参数分析matlab code的几个问题(span,spanh取值问题,幅度比例因子的添加等)


总结


        本文简单介绍了关于ADC动态参数matlab程序的一些思考和改进。文章来源地址https://www.toymoban.com/news/detail-418679.html

到了这里,关于ADC 动态参数分析matlab code的几个问题(span,spanh取值问题,幅度比例因子的添加等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 说说Java基础的几个问题

    1.说下面向对象四大特性 封装、继承、多态、抽象。 2.Java语言有哪些特点 简单易学(Java语言的语法与C语言和C++语言很接近) 面向对象(封装,继承,多态) 平台无关性(Java虚拟机实现平台无关性) 支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)

    2024年02月12日
    浏览(35)
  • chatGPT 答错了好几个问题!

    大家都知道现在 chatGPT 已经在多个领域展现了及其强大的工地,比如文案策划,毕业论文方便,甚至很多程序员都直接让 chatGPT 帮忙写代码了,在一些模板化的代码方面,chatGPT 更展示了优秀的能力。 所以我突然迸发了一个想法,我让 chatGPT 教我学一下操作系统怎么样? 这里

    2023年04月26日
    浏览(44)
  • WordPress恢复时候遇到的几个问题

    1,一键安装 LAMP 最好是选择 CentOS 这种成熟的系统,最开始用 Alibaba Linux 报了好几个错,懒得折腾,最后重置镜像了。 https://lnmp.org/ 2,安装完 LAMP 之后,如果选择的 WordPress 版本太高,可能需要单独升级 php。 3,按照网上教程,例如这个,完成之后注意可能找不到 Nginx 的路

    2024年02月06日
    浏览(49)
  • workerman开发者必须知道的几个问题

    1、windows环境限制 windows系统下workerman单个进程仅支持200+个连接。 windows系统下无法使用count参数设置多进程。 windows系统下无法使用status、stop、reload、restart等命令。 windows系统下无法守护进程,cmd窗口关掉后服务即停止。 windows系统下无法在一个文件中初始化多个监听。 lin

    2023年04月27日
    浏览(48)
  • Docker数据卷使用过程中想到的几个问题

    答:已经创建的容器我的理解是不能改变改变数据卷挂载的。 但有一种方法可以将数据卷挂载记录到文件里,通过修改文件而改变数据卷挂载,就是通过使用docker compose,这样每次只要修改在compose.yaml文件里的参数,就可以达到修改挂载数据卷。 答:我的理解是不可以的。

    2024年02月06日
    浏览(54)
  • 板材激光切割机切割穿孔时注意的几个问题

    激光切割设备广泛应用于钣金、五金制品、钢结构、汽车配件、广告、工艺品等行业,成为加工行业不可缺少的环节。在厚板加工中穿孔时间占很大比重,随着加工板材越来越厚,板材激光切割机切割穿孔也会相应地增加难度。 激光切割机两种常见的穿孔方法 爆破穿孔 材料

    2024年02月05日
    浏览(43)
  • 关于EMC Unity 存储系统DIMM内存的几个问题

    下面是客户咨询最多的几个关于EMC Unity的DIMM内存的问题,供大家参考。 1.  Unity存储能否自己扩容内存 有客户觉得Unity存储的内容太小,想自己扩容内存,很朴实的想法,原来是每个控制器3条16gb,能不能升级到3条32gb或者4条64gb,直接到顶配。 这个回答是肯定不可以,其实对

    2024年02月10日
    浏览(53)
  • 解决android studio中页面闪退的几个问题

    1.如果在新建页面时闪退,解决方法如下 先去miantext里面检查是否注册了当前页面,如果没有注册,需在maintext里面机型注册 如下图(一般来说,AS在新建activity时会自动注册) 如下图 或者alt+enter-Add activity to manifest 可解决问题 2.点击按钮时闪退  如果我的按钮想实现点击跳转

    2024年02月11日
    浏览(45)
  • 了解无线路由器组建无线网络应该注意的几个问题

    无线网络已经不断的深入到我们的日常生活中,基本每多家庭都搭建了一个无线网络,本文以TP-link路由器为例,介绍在组建无线网时,我们应该注意到哪些问题和可以使用的一些技巧,主要以一些实例来详细解说。 一、影响无线网性能的因素 1、传输功率:无线路由发送功率

    2024年02月05日
    浏览(48)
  • PLC有没有前途,作为从电气工程行业转行出来的人简单说几个问题

    1,如果年轻可以试试,如果年纪大了最好不要,国内的企业这个行业加班很多的。刚毕业可以混个10年左右,后面就很难了。最好根据自己的年级看是否转这个行业。 2,如果为了高一点的工资,养家糊口,也可以选着plc,这个行业工资一般,但是如果工程师等级上来,后面

    2024年02月07日
    浏览(127)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包