关于 WASM:1. WASM 基础原理

news2025/6/12 19:50:08

一、WASM 简介

1.1 WebAssembly 是什么?

WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C++、Rust)编译生成,并由浏览器中的 WebAssembly 引擎执行。

简而言之,WASM 是浏览器中的一个“轻量虚拟机”,它的目标是运行速度快、安全性高、体积小,适合执行计算密集型任务。

1.2 设计目标与用途

目标解释说明
 高性能WASM 的指令非常接近底层机器语言,性能可达原生应用的 80%~90%。
 可移植编译后的 .wasm 文件可以在任意支持 WASM 的环境中运行,如浏览器、Node.js、区块链运行时等。
 安全执行运行在浏览器的沙箱环境中,无法直接访问文件系统或网络,只能访问明确授权的资源。
 与 JavaScript 协同设计目标不是取代 JS,而是补强——JS 做逻辑控制,WASM 处理高强度任务。
 可快速加载.wasm 是压缩后的二进制格式,比 .js 加载更快、体积更小。

主要用途

  •  图像/音频/视频处理:如将 C 写的 FFmpeg 编译为 WASM 在浏览器中运行;

  •  游戏引擎移植:如 Unity、Unreal Engine 游戏编译成 Web 版本;

  •  加解密算法实现:比如 AES、SHA256;

  •  PDF / Word / Markdown 渲染

  •  AI/ML 推理模块

  •  区块链智能合约执行环境(如 EOS、Polkadot)

1.3 与 JavaScript 的关系与运行方式

WebAssembly 的运行方式高度依赖 JavaScript,主要是 JS 扮演“调用者”的角色,WASM 负责“执行者”。

协作模式

  • JS 调用 WASM: 加载 .wasm 模块、传参、获取结果;

  • WASM 导出函数: 供 JS 调用;

  • WASM 可导入 JS 提供的函数: 比如浏览器的打印、时间、内存等 API;

  • 共享内存: 二者可以共享 ArrayBuffer(线性内存)。

示例流程图:

           [ C/C++/Rust ]
                |
                ↓
       ┌───────────────┐
       │ 编译成 .wasm  │ <── LLVM、Emscripten
       └───────────────┘
                ↓
    ┌──────────────────────────┐
    │ JavaScript 加载 .wasm    │
    │ └ fetch / instantiate    │
    └──────────────────────────┘
                ↓
    ┌──────────────────────────┐
    │ 浏览器 WASM 引擎执行代码 │
    └──────────────────────────┘

实际代码调用方式

HTML 页面中 JavaScript 调用 add.wasm

fetch('add.wasm') // 从服务器获取名为 'add.wasm' 的 WebAssembly 模块文件
  .then(response => response.arrayBuffer()) // 将响应数据转换为 ArrayBuffer(二进制格式)
  .then(bytes => WebAssembly.instantiate(bytes)) // 将 ArrayBuffer 实例化为 WebAssembly 模块
  .then(result => { // 实例化成功后执行这个回调函数
    const add = result.instance.exports.add; // 从模块中导出名为 'add' 的函数
    console.log(add(5, 7)); // 调用导出的 'add' 函数,传入参数 5 和 7,输出结果 12
  });

注:需要先将一个用 C 写的加法函数编译为 .wasm 文件,JS 才能调用。

1.4 浏览器对 WASM 的支持情况

WASM 是由 Google、Mozilla、Microsoft、Apple 四大厂商联合设计的标准,当前所有主流浏览器均已支持 WebAssembly。

浏览器支持版本(最低)是否默认开启
Chrome57+ 是
Firefox52+ 是
Safari11+ 是
Edge(旧版)16+ 是
Edge(Chromium)所有版本 是
Node.js8+ 是

检测支持的方法:

console.log(typeof WebAssembly === "object"); // true 表示支持

二、WASM 架构与运行模型

WebAssembly 本质上是一个基于栈机的运行时系统,核心架构包括:

  • 模块(Module)

  • 实例(Instance)

  • 内存(Memory)与表(Table)

  • 导入与导出(Import / Export)

  • 栈式指令结构(Stack Machine Model)

2.1 模块(Module)

定义:模块是 WebAssembly 的最小部署单元,可以理解为 .wasm 文件中封装的逻辑程序块,就像一个 JavaScript 模块或 C 的动态链接库(.so/.dll)。

它包含:

  • 类型(函数签名)

  • 函数(函数体)

  • 内存/表定义

  • 全局变量

  • 导入(import)项

  • 导出(export)项

  • 启动函数(start,可选)

示例

(module                         ;; 定义一个 WebAssembly 模块
  (func $add                   ;; 声明一个名为 $add 的函数
    (param $a i32)             ;; 函数参数 $a,类型为 i32(32 位整数)
    (param $b i32)             ;; 函数参数 $b,类型为 i32
    (result i32)               ;; 返回值类型为 i32
    local.get $a              ;; 读取本地变量 $a 的值
    local.get $b              ;; 读取本地变量 $b 的值
    i32.add)                  ;; 对 $a 和 $b 执行加法运算
  (export "add" (func $add))   ;; 将 $add 函数导出,命名为 "add",供外部调用
)

以上 .wat 表示一个导出 add 函数的模块,两个参数相加。

注意:

特性.wat.wasm
全称WebAssembly Text formatWebAssembly Binary format
表现形式可读的文本格式压缩的二进制格式
人类可读性(适合调试、学习)(需反编译工具查看)
执行效率(需先转为 .wasm(浏览器/引擎直接执行)
使用场景编写、调试 WebAssembly 模块运行、部署 WebAssembly 模块
转换工具使用 wat2wasm 转为 .wasm使用 wasm2wat 转为 .wat

2.2 实例(Instance)

定义:模块是“代码模板”,实例(Instance)是模块在内存中的实际运行副本,加载后才具有运行能力。

它包含:

  • 运行时内存

  • 已绑定的导入值

  • 各类资源的实例化副本(函数、表、内存、全局变量)

关系图:

   .wasm
     ↓ 编译
   Module(静态)
     ↓ 实例化
 Instance(运行态)

通过 JS 调用 .wasm,其实是使用模块创建了一个实例,然后调用其导出函数。

2.3 内存(Memory)与表(Table)

内存(Memory)

WebAssembly 的内存是一个线性内存(Linear Memory),表现为一个连续的字节数组(ArrayBuffer),供模块读写数据。

  • 单位是“页”,每页 64KB(65536 bytes

  • 只支持一段内存(Memory Index 为 0)

  • 可以动态增长(grow)

  • 由 JS 与 WASM 共享

// JS 中获取 wasm memory:
const memory = instance.exports.memory;
const bytes = new Uint8Array(memory.buffer);  // 访问 wasm 中的内存数据

表(Table)

WebAssembly 的表是用于存储**函数引用(Function References)**的结构,用于支持间接调用(Indirect Calls)。

常用于:

  • 动态函数调用(类似 C 的函数指针)

  • 多态实现(如虚函数表)

2.4 导入与导出(Import / Export)

导入(Import)

允许模块使用外部定义的函数、内存、表、全局变量等,通常由 JavaScript 提供

示例:

(import "env" "log" (func $log (param i32)))

上述表示模块希望导入一个 JS 的 env.log 函数。

导出(Export)

允许模块暴露函数、内存、表等供外部使用(JS 调用)。

(export "add" (func $add))

表示把 add 函数导出。

JS 调用关系

const imports = {                        // 定义导入对象 imports,供 wasm 模块使用
  env: {                                 // 创建一个 "env" 命名空间(WebAssembly 中常见的导入命名空间)
    log: (arg) => console.log("WASM Log:", arg)  
    // 定义一个 JS 函数 log,它会被 WebAssembly 模块中的代码调用,用于打印日志
  }
};

WebAssembly.instantiate(bytes, imports) // 使用 imports 导入对象实例化 WebAssembly 模块
  .then(result => {                     // 实例化成功后执行这个回调
    const add = result.instance.exports.add; // 从模块中获取导出的函数 "add"
    console.log(add(2, 3));             // 调用 add(2, 3),输出 5(例如是加法函数)
  });

2.5 栈机结构(Stack Machine Model)

定义:WebAssembly 是一门基于栈的虚拟机语言(Stack Machine),所有指令不需要显式传参,而是通过操作数栈进行计算。

特点

  • 无寄存器:不像 x86 或 ARM,WASM 不使用寄存器;

  • 操作数栈工作方式:先压栈,再计算,再出栈;

  • 函数、局部变量、控制流全靠指令栈操作完成

示例:

(func (param $a i32) (param $b i32) (result i32)
  local.get $a   ;; → 将 $a 放入栈顶
  local.get $b   ;; → 将 $b 放入栈顶
  i32.add        ;; → 出栈两个数相加,将结果入栈
)

执行流程是这样的(假设 a=3,b=4):

[ ]            ← 初始空栈
[3]            ← local.get $a
[3, 4]         ← local.get $b
[7]            ← i32.add(弹出两个数,相加,再压入)

结果 7 就是函数返回值。

2.6 小结图示

┌──────────────┐
│  Module (.wasm) │
└──────┬───────┘
       ↓ 实例化
┌──────────────┐
│ Instance       │
│ ┌───────────┐ │
│ │ Memory     │◄── JS 可访问 ArrayBuffer
│ └───────────┘ │
│ ┌───────────┐ │
│ │ Table      ││── 动态函数表
│ └───────────┘ │
│ ┌───────────┐ │
│ │ Export     │◄── JS 调用函数
│ └───────────┘ │
└──────────────┘

         ▲
         │ Import
         │
       ┌──────────────┐
       │ JavaScript   │
       └──────────────┘
组件作用描述
Module静态代码定义 .wasm 文件
Instance模块运行时实例(JS 调用它)
Memory线性内存,WASM/JS 共享
Table函数表,支持间接调用
Import模块向外请求的资源(JS 提供)
Export模块向外暴露的函数或变量
Stack Machine栈结构执行指令,支持无寄存器运算

三、WASM 文件格式

WebAssembly 文件主要有三种格式:

  • .wasm:二进制格式,供浏览器加载执行

  • .wat:文本格式,便于阅读与手写

  • .wast:测试格式(已废弃)

3.1 .wasm 二进制格式

定义:.wasm 是 WebAssembly 的主流部署格式,采用高度压缩的二进制编码(binary encoding),专为浏览器高效解析而设计。

特点

特性描述
高性能加载与编译速度快,接近原生执行
不可读对人类不友好,必须借助工具解析
可移植不依赖平台,跨浏览器兼容
安全沙箱所有行为在沙箱中运行,不会直接访问本地资源

文件结构(简化)

+---------------------+
| Magic Header (4B)   | 0x00 0x61 0x73 0x6D → "\0asm"
| Version (4B)        | 当前一般是 0x01 0x00 0x00 0x00
+---------------------+
| Section 1: Type     |
| Section 2: Import   |
| Section 3: Function |
| Section 4: Table    |
| Section 5: Memory   |
| Section 6: Export   |
| Section 7: Code     |
| Section 8: Data     |
+---------------------+

可以使用工具如 wasm-objdump 来反编译:

wasm-objdump -x my_module.wasm  # 查看段结构
wasm-objdump -d my_module.wasm  # 反汇编

3.2 .wat 文本格式(WebAssembly Text Format)

定义:.wat 是 WebAssembly 的文本表示形式,类似汇编语言,用于手写、调试与学习

特点

特性描述
可读性强类 Lisp 风格,结构化、显式函数与局部变量
易于调试方便修改和反编译观察
.wasm 可互转通过官方工具如 wat2wasmwasm2wat

示例 .wat 文件

(module
  ;; 从 JS 中导入一个名为 "log" 的函数,接受一个 i32 参数
  (import "env" "log" (func $log (param i32)))

  ;; 定义加法函数 $add
  (func $add (param $a i32) (param $b i32) (result i32)
    local.get $a         ;; 获取参数 a
    local.get $b         ;; 获取参数 b
    i32.add              ;; 相加,栈顶变为结果(保留在栈顶)

    ;; 为了既返回又调用 log,我们使用 local.tee,把结果保存到临时变量
    local.tee 0          ;; 把结果存到局部变量 0,并保留在栈上用于返回
    call $log            ;; 调用 log 打印结果
  )

  (export "add" (func $add)) ;; 导出函数
)

搭配 JavaScript 使用:

const imports = {
  env: {
    log: (arg) => console.log("WASM Log:", arg) // log 会在 WASM 中被调用
  }
};

WebAssembly.instantiate(bytes, imports).then(result => {
  const add = result.instance.exports.add;
  console.log("JS Result:", add(2, 3)); // 先 WASM 打印,再 JS 打印
});

输出效果:

WASM Log: 5       // 来自 WebAssembly 内部调用 log
JS Result: 5      // 来自 JS 的 console.log

格式转换

需要安装 WABT 工具集(WebAssembly Binary Toolkit):

# 安装
brew install wabt  # MacOS
sudo apt install wabt  # Ubuntu

# 转换为二进制
wat2wasm add.wat -o add.wasm

# 反编译为文本
wasm2wat add.wasm -o add.wat

3.3 工具推荐

工具作用
wat2wasm文本转二进制
wasm2wat二进制转文本
wasm-objdump查看段信息
wasm-interp执行 wast 测试脚本
WebAssembly Studio在线 IDE
wasm-packRust 生成 WebAssembly
binaryen优化 .wasm

四、WebAssembly 实战

4.1 安装 WebAssembly 工具:WABT

WABT(WebAssembly Binary Toolkit) 是官方的 WASM 编译工具链,包含:

  • wat2wasm将文本 .wat 转成二进制 .wasm

  • wasm2wat反编译 .wasm 为文本

  • wasm-objdump查看段信息

MacOS:

brew install wabt

Ubuntu/Debian:

sudo apt update
sudo apt install wabt

Windows:

  • 前往 GitHub 下载编译好的 ZIP: https://github.com/WebAssembly/wabt/releases

  • 解压并将 bin/ 目录添加到系统环境变量 Path

4.2 项目目录结构

mkdir wasm-demo && cd wasm-demo

项目目录:

wasm-demo/
├── index.html        # 网页
├── main.js           # JavaScript 逻辑
├── add.wat           # WebAssembly 文本源码
├── add.wasm          # 编译生成的二进制文件

4.3 编写 WebAssembly 文本文件(add.wat)

创建文件 add.wat

;; 文件:add.wat
(module
  (func $add (param $a i32) (param $b i32) (result i32)
    local.get $a
    local.get $b
    i32.add)
  (export "add" (func $add))
)

这是一个简单的加法函数,接收两个 i32 整数,返回它们的和,并通过 export 导出。

4.4 编译 .wat 为 .wasm

wat2wasm add.wat -o add.wasm

成功后看到生成的 add.wasm 二进制文件,浏览器可以直接加载它。

4.5 编写 HTML 页面(index.html)

<!-- 文件:index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>WebAssembly 加法演示</title>
</head>
<body>
  <h1>WebAssembly 示例:3 + 4 = <span id="result">?</span></h1>

  <script src="main.js"></script>
</body>
</html>

4.6 编写 JS 加载逻辑(main.js)


// 文件:main.js

async function initWASM() {
  const response = await fetch('add.wasm');              // 从服务器加载名为 add.wasm 的 WebAssembly 文件
  const bytes = await response.arrayBuffer();            // 将响应内容转换为 ArrayBuffer(二进制)

  const { instance } = await WebAssembly.instantiate(bytes); // 实例化 WebAssembly 模块,获取模块实例

  const result = instance.exports.add(3, 4);              // 调用导出的 add 函数,传入 3 和 4

  document.getElementById('result').textContent = result; // 将计算结果显示在页面 id="result" 的元素中
}

initWASM(); // 执行函数,初始化并调用 WASM 模块

说明:

  • fetch() 加载 .wasm 文件

  • WebAssembly.instantiate() 编译 + 实例化

  • 调用导出的函数 add(3, 4)

  • 显示结果到网页

4.7 运行本地服务器测试

浏览器无法直接读取本地文件的 .wasm,必须通过 HTTP 服务运行它。

推荐方法:使用 Python(快速)

# Python 3.x
python -m http.server 8080

然后访问:

http://localhost:8080

如果一切成功,网页上会显示:

WebAssembly 示例:3 + 4 = 7

4.8 小结

步骤内容
1编写 .wat 文件
2使用 wat2wasm 编译
3写 HTML 页面结构
4用 JS 加载 .wasm
5使用本地 HTTP 服务运行

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

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

相关文章

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…