非平稳信号的自适应局部迭代滤波(MATLAB)

news2024/11/16 7:43:18

仍以滚动轴承故障诊断为例,在滚动轴承的运行过程中,其振动信号包含了大量的系统运行状态信息。利用振动信号进行滚动轴承的故障诊断,实际上就是分析振动信号、提取信息的过程。由于非线性力的作用,滚动轴承的故障信号往往是非平稳、非线性的多分量信号。传统的频域分析是以傅里叶变换为基础的全局变换,只适用于用于平稳性信号的分析,使得其应用受到限制。时频分析是以信号局部变换为基础,适用于非平稳信号的分析,因此,时频分析方法是研究的热点问题之一。随着信号处理技术的发展,基于信号分解的时频分析方法已经得到了广泛的应用。这种方法的基本思路是先将信号进行分解,得到瞬时频率具有物理意义的若干个分量信号和一个余量信号。对各个分量分别进行时频变换,将得到的时频分布进行组合,得到整个信号的时频分布。这其中,最重要的一步便是信号分解方法。信号分解方法主要有两种思路:基于迭代的分解方法和基于优化的分解方法。

基于迭代的信号分解方法是应用最为广泛的一类方法,其中最经典的是EMD 方法。但是,EMD 方法也存在很多缺陷,例如欠包络、过包络、端点效应、模态混叠等。基于这样的原因,迭代滤波方法被提出,迭代滤波沿用了EMD 方法的分解框架,采用信号的全局极值尺度来构建滤波器,利用滤波函数与信号卷积来定义信号的均值曲线,通过迭代筛分来分解信号。对迭代滤波的筛分过程收敛性,提出了严格的数学证明。但是,迭代滤波方法是基于全局极值尺度来构建滤波器的,不适合非平稳信号的分析。因此自适应局部迭代滤波算法被提出,利用福克普朗克方程来构建滤波器,通过信号的局部极值尺度来获取滤波器参数,将IF方法推广到非平稳信号的分析中。与EMD等方法相比,自适应局部迭代滤波方法具有更强的数学基础,同时在分解精度、端点效应等方面,相比其他迭代方法具有一定的优势。

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

  • 工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》《控制与决策》等期刊审稿专家,擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

function [IMF,mask_lengths] = ALIF(f,options,mask_lengths_given)
% 
%% We deal with the input

if nargin == 0,  help ALIFv5_1; return; end
if nargin == 1, options = Settings_ALIF; end
if nargin == 2, mask_lengths_given=[]; end

extensionType = 'p'; % used in the calculations of mins and maxs

N = length(f);
if size(f,1)>size(f,2)
    f = f.';
end
if size(f,1)>1
    disp('Wrong dataset, the signal must be a single row vector')
end
IMF =[];

if options.plots>0
    if options.saveplots==1
        nameFile=input('Please enter the name of the file as a string using '' and '' <<  '); %'v081_Ex2';
    end
end

%% Main code

fprintf(['\n\n         ****************** WARNING ******************\n\n '...
    'We assume periodicity in the signal and\n\n  its instantaneous periods\n\n' ...
    '         *********************************************\n'])
pause(0.5)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%       Adaptive Local Iterative Filtering           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tic

load('prefixed_double_filter','MM');
if length(f)>length(MM)
    fprintf(['\n\n      ********   Warning  *********\n\n'...
        ' The filter MM should contain more points\n'...
        ' to properly decompose the given signal\n\n'...
        ' We will use interpolation to generate a\n'...
        ' filter with the proper number of points\n\n'...
        '      *****************************\n\n'])
end

%%%%%%%%%%%%%%% Identify extreme points %%%%%%%%%%%%%%
maxmins_f=Maxmins_v2(f,extensionType);


while  length(maxmins_f) > (options.ALIF.ExtPoints) && size(IMF,1) < (options.ALIF.NIMFs) && toc < (options.maxTime)
    %% Outer loop
    
    if options.verbose>0
        fprintf('\n   ======================== IMF # %1.0d ========================\n',size(IMF,1)+1)
    end
    
    h = f;
    
    %%%%%%%%%%  Computing the mask length  %%%%%%%%%%%%%%%%
    
    if not(isempty(mask_lengths_given)) && size(mask_lengths_given,1)>size(IMF,1)
        if options.verbose>0
            fprintf('\n    ---------- Mask length provided by the user ----------\n')
        end
        
        iT_f=options.ALIF.xi*mask_lengths_given(size(IMF,1)+1,:);
    else
        if options.verbose>0
            fprintf('\n    --------------- Mask length computation ---------------\n')
        end
        
        T_f=[diff(maxmins_f) (maxmins_f(1)+N-maxmins_f(end))];
        temp_T_f=[T_f T_f T_f T_f T_f T_f T_f T_f T_f T_f T_f];
        temp_maxmins_f=[maxmins_f maxmins_f+N maxmins_f+2*N maxmins_f+3*N ...
            maxmins_f+4*N maxmins_f+5*N maxmins_f+6*N ...
            maxmins_f+7*N maxmins_f+8*N maxmins_f+9*N maxmins_f+10*N];
        temp_iT_f= interp1(temp_maxmins_f,temp_T_f,1:11*N,'cubic');
        iT_f = temp_iT_f(5*N+1:6*N);
        
        
        nTry=1;
        
        iT_f0=iT_f;
        
        if options.verbose>0
            fprintf('\n       ~~~~~~~~~~~~~~ Mask length using IF ~~~~~~~~~~~~~~\n')
        end
        
        OK=0;
        while OK==0
            opts=Settings_IF('IF.ExtPoints',3,'IF.NIMFs',nTry,'verbose',options.verbose,'IF.alpha',1,'IF.extensionType','p');
            IMF_iT_f = IF_v2(iT_f0,opts);  % We use IF algo for periodic signals to compute the mask length
            if 0>=min(IMF_iT_f(end,:)) && (size(IMF_iT_f,1)-1)==nTry
                nTry=nTry+1;
            elseif 0>=min(IMF_iT_f(end,:)) && not((size(IMF_iT_f,1)-1)==nTry)
                disp('Negative mask length')
                return
            else
                OK=1;
            end
        end
        
        if options.verbose>0
            fprintf('\n       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n')
        end
        
        iT_f = IMF_iT_f(end,:);
        nn = 2*options.ALIF.xi;
        iT_f = nn*iT_f;
        
        if options.plots>0
            figMask=figure;
            title(['Mask length IMF_{' num2str(size(IMF,1)+1) '}'])
            plot(iT_f,'b')
            hold on
            plot(maxmins_f,nn*T_f,'kx')
            plot(nn*sum(IMF_iT_f,1),'r')
            legend('Mask length','periods of the signal','Instantaneous periods')
            set(figMask,'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
            if options.saveplots==1
                saveas(figMask,[nameFile '_MaskLength_IMF_' num2str(size(IMF,1)+1)], 'fig')
                saveas(figMask,[nameFile '_MaskLength_IMF_' num2str(size(IMF,1)+1)], 'epsc')
                saveas(figMask,[nameFile '_MaskLength_IMF_' num2str(size(IMF,1)+1)], 'png')
            end
            pause(0.01)
        end
    end
    
    mask_lengths(size(IMF,1)+1,:)=iT_f;
    
    if options.verbose>0
        fprintf('\n    ------------------------------------------------------\n')
    end
    
    inStepN=0;
    
    W=zeros(N,N);
    for i=1:N
        wn = get_mask_v1(MM, iT_f(i));
        wn=wn/norm(wn,1);
        len = (length(wn)-1)/2;
        wn = [reshape(wn,1,2*len+1) zeros(1,N-2*len-1)];
        W(i,:)=circshift(wn,[0 (i-len-1)]);
    end
    
    %%
    
    if options.verbose>0
        fprintf('\n IMF # %1.0d\n',size(IMF,1)+1)
        fprintf('\n  step #            SD\n\n')
    end
    
    SD=Inf;
    
    if options.plots>0
        figM=figure;
    end
    while SD > options.ALIF.delta && inStepN<1000
        %% Inner loop
        
        inStepN=inStepN+1;
        
        if options.verbose>0
            
        end
        
        %%%%%%%% Compute the average %%%%%%%%%
        
        ave = W*h';
        
        %%%%%%%%%%%%%%%%%% generating h_n %%%%%%%%%%%%%%%%%%
        
        SD = norm(ave)^2/norm(h)^2;
        h = h - ave';
        
        if options.verbose>0
            fprintf('    %2.0d      %1.14f\n',inStepN,SD)
        end
        
        if options.plots>0 && rem(inStepN,1)==0
            
            textLeg{1}='f-h';
            textLeg{2}='h';
            titLeg=sprintf('IMF # %2.0d  Inner step =   %2.0d',size(IMF,1)+1,inStepN);
            
            title(sprintf('IMF # %2.0d  Inner step =   %2.0d',size(IMF,1)+1,inStepN))
            plot_imf_v8([h;f-h],1:length(h),titLeg,textLeg,figM);
            set(figM,'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
            
            if options.saveplots==1
                saveas(figM,[nameFile '_IMF' num2str(size(IMF,1)+1) '_step' num2str(inStepN)], 'fig')
                saveas(figM,[nameFile '_IMF' num2str(size(IMF,1)+1) '_step' num2str(inStepN)], 'epsc')
                saveas(figM,[nameFile '_IMF' num2str(size(IMF,1)+1) '_step' num2str(inStepN)], 'png')
            end
            pause(0.01)
        end
    end
    
    %%%%%%%%%%%%%%%%%%%%%% Adding the new IMF %%%%%%%%%%%%%%%%%%%%%
    IMF=[IMF; h];
    
    %%%%%%%%%%%%%%%%%%%%% Updating the signal %%%%%%%%%%%%%%%%%%%%%%
    f = f-h;
    
    %%%%%%%%%%%%%%% Identify extreme points %%%%%%%%%%%%%%
    maxmins_f=Maxmins_v2(f,extensionType);
    
    if options.saveEnd == 1
        save('Decomp_ALIF_v5.mat')
    end
    
end

%%%%%%%%%%%%%%%%%%%%%%%%% Adding the trend %%%%%%%%%%%%%%%%%%%%%%%
IMF =[IMF; f];

if options.saveEnd == 1
    save('Decomp_ALIF_v5.mat')
end

end


%% Auxiliar functions

function a=get_mask_v1(y,k)
% get the mask with length 2*k+1
% k could be an integer or not an integer
% y is the area under the curve for each bar

n=length(y);
m=(n-1)/2;

if k<=m % The prefixed filter contains enough points
    
    if mod(k,1)==0     % if the mask_length is an integer
        
        a=zeros(1,2*k+1);
        
        for i=1:2*k+1
            s=(i-1)*(2*m+1)/(2*k+1)+1;
            t=i*(2*m+1)/(2*k+1);
            
            %s1=s-floor(s);
            s2=ceil(s)-s;
            
            t1=t-floor(t);
            %t2=ceil(t)-t;
            
            if floor(t)<1
                disp('Ops')
            end
            a(i)=sum(y(ceil(s):floor(t)))+s2*y(ceil(s))+t1*y(floor(t));
        end
        
    else   % if the mask length is not an integer
        new_k=floor(k);
        extra = k-new_k;
        c=(2*m+1)/(2*new_k+1+2*extra);
        
        a=zeros(1,2*new_k+3);
        
        t=extra*c+1;
        t1=t-floor(t);
        %t2=ceil(t)-t;
        if k<0
            disp('Ops')
        end
        a(1)=sum(y(1:floor(t)))+t1*y(floor(t));
        
        for i=2:2*new_k+2
            s=extra*c+(i-2)*c+1;
            t=extra*c+(i-1)*c;
            %s1=s-floor(s);
            s2=ceil(s)-s;
            
            t1=t-floor(t);
            
            a(i)=sum(y(ceil(s):floor(t)))+s2*y(ceil(s))+t1*y(floor(t));
        end
        t2=ceil(t)-t;
        
        a(2*new_k+3)=sum(y(ceil(t):n))+t2*y(ceil(t));
    end
else % We need a filter with more points than MM, we use interpolation
    dx=0.01;
    % we assume that MM has a dx = 0.01, if m = 6200 it correspond to a
    % filter of length 62*2 in the physical space
    f=y/dx; % function we need to interpolate
    dy=m*dx/k;
    b=interp1(0:m,f(m+1:2*m+1),0:m/k:m);
    if size(b,1)>size(b,2)
        b=b.';
    end
    if size(b,1)>1
        fprintf('\n\nError!')
        disp('The provided mask is not a vector!!')
        a=[];
        return
    end
    a=[fliplr(b(2:end)) b]*dy;
    if abs(norm(a,1)-1)>10^-14
        %         fprintf('\n\nError\n\n')
        %         fprintf('Area under the mask = %2.20f\n',norm(a,1))
        %         fprintf('it should be equal to 1\nWe rescale it using its norm 1\n\n')
        a=a/norm(a,1);
    end
end

end


function varargout = Maxmins(f,extensionType)


% Identify the maxima and minima of a signal f

if nargin == 1, extensionType = 'c'; end
N = length(f);
maxmins=zeros(1,N);
df = diff(f);


h = 1;
cIn=0;
if strcmp(extensionType,'p') && df(1) == 0 && df(end) == 0
    while df(h)==0
        cIn=cIn+1;
        h=h+1;
    end
end

c = 0;
cmaxmins=0;
for i=h:N-2
    if   df(i)*df(i+1) <= 0
        if df(i+1) == 0
            if c == 0
                posc = i;
            end
            c = c + 1;
        else
            if c > 0
                cmaxmins=cmaxmins+1;
                maxmins(cmaxmins)=posc+floor((c-1)/2)+1;
                c = 0;
            else
                cmaxmins=cmaxmins+1;
                maxmins(cmaxmins)=i+1;
            end
        end
    end
end
if c > 0
    cmaxmins=cmaxmins+1;
    maxmins(cmaxmins)=mod(posc+floor((c+cIn-1)/2)+1,N);
    if maxmins(cmaxmins)==0
        maxmins(cmaxmins)=N;
    end
end

maxmins=maxmins(1:cmaxmins);

if strcmp(extensionType,'p') % we deal with a periodic signal
    if isempty(maxmins)
        maxmins = 1;
    else
        if maxmins(1)~=1 && maxmins(end)~=N
            if (f(maxmins(end)) > f(maxmins(end)+1) && f(maxmins(1)) > f(maxmins(1)-1)) || (f(maxmins(end)) < f(maxmins(end)+1) && f(maxmins(1)) < f(maxmins(1)-1))
                maxmins=[1 maxmins];
            end
        end
    end
elseif strcmp(extensionType,'c')
    if isempty(maxmins)
        maxmins = [1, N];
    else
        if maxmins(1) ~= f(1) && maxmins(end) ~= f(end)
            maxmins = [1, maxmins, N];
        elseif f(maxmins(1)) ~= f(1)
            maxmins = [1, maxmins];
        elseif  f(maxmins(end)) ~= f(end)
            maxmins = [maxmins, N];
        end
    end
elseif strcmp(extensionType,'r')
    if isempty(maxmins)
        maxmins = [1, N];
    else
        if maxmins(1) ~= f(1) && maxmins(end) ~= f(end)
            maxmins = [1, maxmins, N];
        elseif f(maxmins(1)) ~= f(1)
            maxmins = [1, maxmins];
        elseif  f(maxmins(end)) ~= f(end)
            maxmins = [maxmins, N];
        end
    end
end

if nargout<=1
    varargout{1}=maxmins;
elseif nargout==2
    if f(maxmins(1))>f(maxmins(2))
        % Maxes
        varargout{1}=maxmins(1:2:end);
        % Mins
        varargout{2}=maxmins(2:2:end);
    elseif f(maxmins(2))>f(maxmins(1))
        % Maxes
        varargout{1}=maxmins(2:2:end);
        % Mins
        varargout{2}=maxmins(1:2:end);
    else
        disp('Problem in identifying Extrema')
        varargout{1}=[];
    end
end

end

知乎学术咨询:
https://www.zhihu.com/consult/people/792359672131756032?isMe=1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么需要做网络安全服务?

网络安全服务之所以重要&#xff0c;是因为它在保护数字资产、维护企业运营、确保法规遵从、防范恶意行为以及建立信任等方面扮演着关键角色。以下是一些主要的理由&#xff1a; 保护核心资产和数据&#xff1a; 数字化转型使得企业数据变得极其宝贵&#xff0c;包括知识产权、…

离散模态信息作为细粒度标记用于多模态知识图谱补全--MyGO

多模态知识图谱&#xff08;MMKG&#xff09;存储了包含有丰富的多模态描述信息的、结构化的世界知识。为了克服其固有的不完整性&#xff0c;多模态知识图谱补全&#xff08;MMKGC&#xff09;希望利用三元组的结构信息及实体的多模态信息&#xff0c;从给定的MMKG中发掘未观察…

智能工厂解决方案—智能数据采集平台

智慧工厂总体架构图 由智能化生产、智能化管理和产业链互联三个层面构成,前两个层面立足于企业自身,以智能工厂为建设目标,实习企业机体自身的智能化,而产业链互联则是以互联网技术为基础,将企业融入到产业链的整体生态环境中,逐步实现制造资源的服务化和云化,并与生态系…

爬数据是什么意思?

爬数据的意思是&#xff1a;通过网络爬虫程序来获取需要的网站上的内容信息&#xff0c;比如文字、视频、图片等数据。网络爬虫&#xff08;网页蜘蛛&#xff09;是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。 学习一些爬数据的知识有什么用呢&#x…

SAP 接口-银行账号主数据维护接口【MDM->SAP】开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

接口映射字段 开发通用说明 根据MDM传输字段调用BAPI生成银行账号及开户行。 开户行维护BAPI【BAPI_BANK_CREATE】 银行账号维护BAPI【BAPI_FCLM_BAM_AMD_BNKANT】 接口字段【ZZZH 主账户标识】=1时字段【DTAAI】DME标识赋值:常用; 接口字段【ZZZH 主账户标识】=0时字段…

mysql中的递归函数recursive

递归部门 WITH recursive dept_tree AS (SELECTsd.mine_id AS mine_id,sd.dept_id AS dept_id,sd.tenant_id AS tenant_id,sd.order_num,sd.dept_name AS topName,sd.dept_id AS topIdFROMsys_dept sdWHERE<!-- 加上or后也会查询出dept节点 sd.parent_id #{deptId} or sd.…

关于电商平台分类||电商平台商品分类接口|电商平台商品数据

电商平台 做电商&#xff0c;则要有电商平台&#xff0c;一个为 企业 或 个人 提供网上交易洽谈的平台。. 企业电子商务平台是建立在 Internet 网上进行商务活动的虚拟网络空间和保障商务顺利运营的管理环境&#xff1b;是协调、整合 信息流 、货物流、 资金流 有序、关联、高效…

【深度学习】pytorch训练中的一个大坑

使用的命令&#xff1a;iostat -x 5 可以看到 ssd的利用率已经满了。 之前在的数据集放在了 hdd上&#xff0c;训练结果特别慢。 所以我把它移动到了ssd上&#xff0c;然后训练参数用的 resume&#xff0c; 但是&#xff01;&#xff01;&#xff01;&#xff01;它把历史记住…

音乐:触动心灵的艺术语言

Enjoy your music 音 乐 作为一种跨越时空和文化的艺术形式&#xff0c;拥有着无穷的魅力和力量。 它不仅能够带给我们愉悦的听觉享受&#xff0c;还对我们的身心健康、认知发展和社会交往产生着深远的影响。 一、音乐的基本元素 音乐由多个基本元素构成&#xff0c;包括…

【MySQL备份】Percona XtraBackup全量备份实战篇

目录 1. 前言 2.准备工作 2.1.创建备份目录 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文将继续上篇【My…

【FFmpeg】av_read_frame函数

目录 1.av_read_frame1.2 从pkt buffer中读取帧&#xff08;avpriv_packet_list_get&#xff09;1.3 从流当中读取帧&#xff08;read_frame_internal&#xff09;1.3.1 读取帧&#xff08;ff_read_packet&#xff09;1.3.2 解析packet&#xff08;parse_packet&#xff09;1.3…

方正小标宋简体、仿宋GB2312、楷体GB2312字体

文章目录 下载地址所有的文件wps使用方正小标宋简体、仿宋GB2312、楷体GB2312 字体用途方正小标宋简体仿宋GB2312楷体GB2312 下载地址 【金山文档 | WPS云文档】 方正小标宋简体、仿宋GB2312、楷体GB2312 https://kdocs.cn/l/cksgHDLneqDk 所有的文件 wps使用 方正小标宋简体…

Java高级重点知识点-18-线程

文章目录 多线程线程线程安全线程状态线程间通信线程池 多线程 并发与并行 并发&#xff1a;指两个或多个事件在同一个时间段内发生。并行&#xff1a;指两个或多个事件在同一时刻发生&#xff08;同时发生&#xff09;。 对于单核CPU系统中&#xff0c;我们可以同时运行多个…

物联网的技术和应用有哪些?

随着科技的飞速发展&#xff0c;物联网已经成为连接世界的重要纽带&#xff0c;塑造着我们未来的生活。我们一起深入探索物联网的前沿技术和前瞻性应用&#xff0c;一窥未来的可能性。 获取物联网解决方案&#xff0c;YesPMP平台一站式物联网开发服务。 提示&#xff1a;智慧家…

【计算机网络期末复习】例题汇总(一)

重点例题选择填空简答题与传输媒体的接口的特性 重点 计算机网络的性能指标计算机网络体系结构 例题 选择 填空 交换机内部各个端口之间是用【总线电路】连接的&#xff0c;集线器各端口之间是【存储转发】的 交换机依据【依据帧的目的地址在路由表中查找匹配 】&#xff0c…

基于协同过滤的航空票务推荐系统的设计与实现(飞机票推荐系统)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

OFDM的缺点与关键技术

子载波间干扰英文简写ICI&#xff0c;ICI可能由各种原因引起 在多径信道中&#xff0c;CP小于最大附加时延时收发系统载波频率偏差和采样偏差收发系统相对移动&#xff0c;存在多普勒频移 ICI是制约OFDM系统性能的主要重要因素之一 对频率偏差敏感----->同步技术&#xff0…

【C++】——【 STL简介】——【详细讲解】

目录 ​编辑 1. 什么是STL 2. STL的版本 3. STL的六大组件 1.容器(Container)&#xff1a; 2.算法(Algorithm)&#xff1a; 3.迭代器(Iterator)&#xff1a; 4.函数(Function)&#xff1a; 5.适配器(Adapter)&#xff1a; 6.分配器(Allocator)&#xff1a; 4. STL的…

振弦采集仪的工程安全监测实践与案例分析

振弦采集仪的工程安全监测实践与案例分析 振弦采集仪是一种常用的工程安全监测仪器&#xff0c;通过测量被监测结构的振动频率与振型&#xff0c;可以实时监测结构的安全状况。本文将结合实践经验和案例分析&#xff0c;探讨振弦采集仪在工程安全监测中的应用。 一&#xff0c…

前端Bug 修复手册

1.前端长整数精度丢失问题 &#xff08;1&#xff09;问题 在前后端联调时&#xff0c;发现后端有一个接口返回的值和前端页面上展示的值不一致。 后端Java实现的接口如下&#xff0c;返回一个json格式的大整数 123456789123456789&#xff1a; 但是前端请求这个接口后&…