1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 使用Matlab提取ADC数据占空比变化的波形

使用Matlab提取ADC数据占空比变化的波形

时间:2022-06-17 04:01:52

相关推荐

使用Matlab提取ADC数据占空比变化的波形

提取变化占空比的规则如下:

1. 如果占空比发生 >=5% 的变化,则认为占空比发生变化;

2. 正常的1个周期100个,其中连续 <0.1V 变化的点约为40个左右;

3. 那么,40*(1+5%)=42,即理论上连续超过42个点变化<0.1V,认为是占空比发生变化。

代码实现的方法如下:

1. 设置1个参考点;

2. 对比其后面连续44个点的值相对参考点是否 <0.1V变化(为什么用44个点呢,因为如果为43个点,则结果会有无数的波形);

3. 如果超过连续44个点均<0.1V,则认为占空比发生变化。

效果如下图

% 使用Matlab提取ADC数据中占空比变化的波形% 本代码实现对ADC数据的占空比变化波形提取,并记录噪声的数据编号以及存储噪声图片% 采样频率为一个波形周期采样100个点%% 提取变化占空比的规则如下:% 1. 如果占空比发生 >=5% 的变化,则认为占空比发生变化;% 2. 正常的1个周期100个,其中连续 <0.1V 变化的点约为40个左右;% 3. 那么,40*(1+5%)=42,即理论上连续超过42个点变化<0.1V,认为是占空比发生变化。%% 代码实现的方法如下:% 1. 设置1个参考点VA;% 2. 对比其后面连续44个点的值相对参考点是否 <0.1V变化(为什么用44个点呢,因为如果为43个点,则结果会有无数的波形);% 3. 如果超过连续44个点均<0.1V,则认为占空比发生变化。%% 使用时可能需要修改的内容% 1. 须根据实际文件夹的路径进行修改folderpath% 2. 须根据实际波形的连续高或低电平时,其电压变化Vthreshold% 3. 须根据实际波形的连续高或低电平时,其连续不变化的点数Number_continuous% 4. 须根据实际数据文件的数量,file_start_serial和file_end_serial% 5. 须根据实际数据的名称修改'rBufPt_'字符串%% 运行后的结果% 1. 运行完成后,会在folderpath文件夹下生成一个记录占空比变化的位置的log_width.txt以及存放图片的picture_width% 清理命令行中的内容clc;% 清理内存变量clear;% 手动设置文件路径folderpath = 'E:\data\001\';% 自动新建用于存放图片的文件夹picfolder = [folderpath,'picture_width'];mkdir(picfolder);% 手动设置2大参数Vthreshold = 0.1;Number_continuous = 44;% 自动在log.txt中记录启动时间fid_log=fopen([folderpath,'\log_width.txt'],'at+');%写入文件路径fprintf(fid_log,'Start time %s.\n',datestr(now,31)); fclose(fid_log);% 手动设置数据文件编号的范围:文件读到最后一个数据文件file_start_serial = 13;file_end_serial = 400;%% 打开文档,并读取数据到内存中%file_serial = 1;%默认的文件编号%fid_data = fopen([folderpath,'/rBufPt_',num2str(file_serial),'.bin'],'rb');%[rBuf] = fread(fid_data);%fclose(fid_data);% %% 仅读取1组数据,每隔8个字节取数据%rBuf1 = rBuf(1:8:end);% %% 将有效数字量转换成模拟量%parfor i = 1:length(rBuf1) % if rBuf1(i)>127% rBuf1(i) = rBuf1(i) - 256 ;% end% rBuf1(i) = (rBuf1(i) * 8.29)/1000 ; % rBuf1(i)=rBuf1(i) + 0.9 ; %endfor file_serial = file_start_serial : file_end_serial% 在命令行中打印当前file_serial的值和启动时间,方便查看当前运行进程fprintf('NO %d.\n',file_serial);fprintf('Percent %.2f%%.\n',file_serial/file_end_serial*100);fprintf('%s.\n',datestr(now,31));% 打开文档,并读取数据到内存中fid_data = fopen([folderpath,'/rBufPt_',num2str(file_serial),'.bin'],'rb');[rBuf] = fread(fid_data);fclose(fid_data);% 仅读取1组数据,每隔8个字节取数据rBuf1 = rBuf(1:8:end);% 将有效数字量转换成模拟量parfor i = 1:length(rBuf1) if rBuf1(i)>127rBuf1(i) = rBuf1(i) - 256 ;endrBuf1(i) = (rBuf1(i) * 8.29)/1000 ; rBuf1(i)=rBuf1(i) + 0.9 ; end% 启动秒表计时器tic%读取有效模拟量的长度length_rBuf1 = length(rBuf1);%设置变量,用于代表上次出现噪声信号的indexlast_log_index = 0;% STEP = 1,对数据从头到尾进行处理(4200000前采到的数据不正常,不使用)for index = 4200000 : length_rBuf1-Number_continuoustmp_diff = 0;i = 0;% 每增加一次,进行后面44个点的判断for i = (index+1) : (index + Number_continuous) if(abs(rBuf1(index) - rBuf1(i)) < 0.1)tmp_diff = tmp_diff + 1;else tmp_diff = 0;endend% 43是个分界线,如果小于等于43否则不停的扫出来if tmp_diff >= 44%如果与上次保存的数据在图片中位置相差不大,不保存(比如不到50个点)if index > last_log_index +Number_continuous %如果与上次保存的数据在图片中位置相差不大,不保存last_log_index = index; % 将Noise的编号记录到log中fid_log=fopen([folderpath,'/log_width.txt'],'at+');%写入文件路径fprintf(fid_log,'%d.bin UP index is %.8d.\n',file_serial,index); fclose(fid_log);% 将噪声图片保存figure(1);plot(rBuf1); legend('LVDS-CH4');hold on; xstart = index - 500;xend = index + 500;xlim([xstart xend]);saveas(gcf,[picfolder,'/rBufPt_',num2str(file_serial),'_',num2str(index),'.jpg']);hold off; endendend% 从秒表读取已用时间tfly = toc;% 在命令行打印单次运行的耗时tflyend% 任务结束,发出火车叫声for i = 1:10load train;sound(y,Fs);end% 在log中记录此程序结束的日期与时间fid_log=fopen([folderpath,'/log_width.txt'],'at+');%写入文件路径fprintf(fid_log,'End time %s.\n',datestr(now,31)); fclose(fid_log);% 程序运行结束,60s后关闭电脑% system('shutdown -s -t 60')

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。