<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://liuyirigel.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://liuyirigel.github.io/" rel="alternate" type="text/html" /><updated>2026-06-22T08:27:05+00:00</updated><id>https://liuyirigel.github.io/feed.xml</id><title type="html">LiuyiRigel</title><subtitle>Rose_is_blue</subtitle><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><entry><title type="html">[工程笔记] torch_ssqueezepy：SSqueezepy纯PyTorch重构的可行性验证与非平稳信号时频分析</title><link href="https://liuyirigel.github.io/posts/2026/05/paper-note-7/" rel="alternate" type="text/html" title="[工程笔记] torch_ssqueezepy：SSqueezepy纯PyTorch重构的可行性验证与非平稳信号时频分析" /><published>2026-05-14T00:00:00+00:00</published><updated>2026-05-14T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/05/paper-note-7</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/05/paper-note-7/"><![CDATA[<div align="center">
    <img src="../images/paper_images/04_bearing_analysis.png" style="width: 85%; 
                border-radius: 5px; 
                box-shadow: 0 10px 20px rgba(0,0,0,0.2); 
                border: 1px solid #eee;" />
</div>
<p><br /></p>

<p>对SSqueezepy进行纯PyTorch重构的可行性分析、核心算法验证、非平稳信号（滚动轴承故障）时频分析可视化及同步挤压变换在故障诊断中的应用评估。</p>

<hr />

<h2 id="1-背景与动机">1. 背景与动机</h2>

<p>SSqueezepy [1] 是当前Python生态中性能最优的同步挤压变换（Synchrosqueezing）实现，提供CWT、STFT、SSQ_CWT、SSQ_STFT等时频分析工具。但其底层依赖NumPy、Numba、CuPy，<strong>不支持自动微分</strong>，无法嵌入深度学习训练流程。</p>

<p>TF-C [2] 通过时域编码器和频域编码器的对比学习实现时间序列自监督预训练。其频域分支采用 <code class="language-plaintext highlighter-rouge">torch.fft.fft</code> 做全局傅里叶变换，隐含平稳性假设。对于滚动轴承振动信号这类典型非平稳信号，故障冲击具有瞬态性和时变频谱特征，全局FFT无法刻画其时频局部特性[3]。</p>

<p><strong>本文目标</strong>：验证SSqueezepy纯PyTorch重构的可行性，并评估其在非平稳信号（滚动轴承故障）分析中的表现。</p>

<hr />

<h2 id="2-ssqueezepy-架构分析">2. SSqueezepy 架构分析</h2>

<h3 id="21-核心组件">2.1 核心组件</h3>

<table>
  <thead>
    <tr>
      <th>模块</th>
      <th>行数</th>
      <th>复杂度</th>
      <th>功能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">algos.py</code></td>
      <td>~600</td>
      <td>高</td>
      <td>CPU/GPU加速内核（Numba JIT + CUDA）</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">_ssq_cwt.py</code></td>
      <td>~400</td>
      <td>高</td>
      <td>同步挤压 + 相位变换</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">_cwt.py</code></td>
      <td>~350</td>
      <td>高</td>
      <td>CWT FFT卷积引擎</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">_stft.py</code></td>
      <td>~350</td>
      <td>高</td>
      <td>调制STFT</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">wavelets.py</code></td>
      <td>~500</td>
      <td>中</td>
      <td>Wavelet类 + 时频属性</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">_gmw.py</code></td>
      <td>~300</td>
      <td>中</td>
      <td>Generalized Morse Wavelet</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ridge_extraction.py</code></td>
      <td>~200</td>
      <td>中</td>
      <td>前向-后向脊线追踪</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">utils/fft_utils.py</code></td>
      <td>~300</td>
      <td>中</td>
      <td>FFT后端抽象（scipy/pyfftw/PyTorch）</td>
    </tr>
  </tbody>
</table>

<h3 id="22-双后端设计">2.2 双后端设计</h3>

<p>SSqueezepy已经内置PyTorch + CuPy的GPU加速路径：</p>

<ul>
  <li><strong>CPU路径</strong>：<code class="language-plaintext highlighter-rouge">numpy</code> + <code class="language-plaintext highlighter-rouge">scipy.fft</code> + Numba <code class="language-plaintext highlighter-rouge">@jit</code></li>
  <li><strong>GPU路径</strong>：<code class="language-plaintext highlighter-rouge">torch.tensor</code> + <code class="language-plaintext highlighter-rouge">torch.fft</code> + CuPy Raw CUDA Kernel</li>
</ul>

<p>GPU路径的同步挤压核心 (<code class="language-plaintext highlighter-rouge">ssqueeze_fast</code>, <code class="language-plaintext highlighter-rouge">indexed_sum_onfly</code>) 使用 <strong>CuPy原始CUDA内核</strong>（C++字符串模板编译），而非PyTorch原生操作。这是重构的主要目标。</p>

<h3 id="23-pytorch可替代性矩阵">2.3 PyTorch可替代性矩阵</h3>

<table>
  <thead>
    <tr>
      <th>操作</th>
      <th>CPU实现</th>
      <th>GPU实现</th>
      <th>PyTorch替代</th>
      <th style="text-align: center">难度</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>FFT</td>
      <td>scipy.fft</td>
      <td>torch.fft</td>
      <td><code class="language-plaintext highlighter-rouge">torch.fft</code> ✅</td>
      <td style="text-align: center">⭐</td>
    </tr>
    <tr>
      <td>小波生成</td>
      <td>NumPy math</td>
      <td>torch.*</td>
      <td><code class="language-plaintext highlighter-rouge">torch.exp/log/pow</code> ✅</td>
      <td style="text-align: center">⭐</td>
    </tr>
    <tr>
      <td>CWT卷积</td>
      <td>FFT乘法</td>
      <td>torch</td>
      <td><code class="language-plaintext highlighter-rouge">torch.fft</code> ✅</td>
      <td style="text-align: center">⭐⭐</td>
    </tr>
    <tr>
      <td>相位变换</td>
      <td>Numba循环</td>
      <td>CuPy kernel</td>
      <td><code class="language-plaintext highlighter-rouge">torch</code> 向量化 ✅</td>
      <td style="text-align: center">⭐⭐</td>
    </tr>
    <tr>
      <td><strong>indexed_sum</strong></td>
      <td>Numba双循环</td>
      <td><strong>CuPy Raw CUDA</strong></td>
      <td><code class="language-plaintext highlighter-rouge">torch.scatter_add</code>/Triton ⚠️</td>
      <td style="text-align: center">⭐⭐⭐⭐⭐</td>
    </tr>
    <tr>
      <td>脊线提取</td>
      <td>Numba DP</td>
      <td>不可用</td>
      <td><code class="language-plaintext highlighter-rouge">torch.jit.script</code> ⚠️</td>
      <td style="text-align: center">⭐⭐⭐</td>
    </tr>
    <tr>
      <td>同步挤压协调</td>
      <td>NumPy</td>
      <td>torch</td>
      <td>需重写散射逻辑 ⚠️</td>
      <td style="text-align: center">⭐⭐⭐</td>
    </tr>
  </tbody>
</table>

<p><strong>最大挑战</strong>：<code class="language-plaintext highlighter-rouge">indexed_sum</code>（scatter-add操作）是同步挤压的核心——将 <code class="language-plaintext highlighter-rouge">(scale, time)</code> 平面的值按瞬时频率索引累加到 <code class="language-plaintext highlighter-rouge">(frequency, time)</code> 平面。原始实现使用Numba JIT双循环（CPU）或CuPy原始CUDA内核（GPU）。</p>

<hr />

<h2 id="3-纯pytorch重构设计">3. 纯PyTorch重构设计</h2>

<h3 id="31-项目结构">3.1 项目结构</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>torch_ssqueezepy/
├── __init__.py          # 公开API
├── _gmw.py              # GMW小波生成 ✅
├── wavelets.py          # Wavelet类（5种小波）✅
├── _cwt.py              # CWT变换 ⚠️
├── _stft.py             # STFT变换 ⚠️
├── algos.py             # indexed_sum + ssqueeze_fast
├── ssqueezing.py        # 同步挤压
├── ridge_extraction.py  # 脊线提取
└── nn/
    └── __init__.py      # nn.Module封装（CWT, SSQ_CWT, STFT, ISTFT）
</code></pre></div></div>

<h3 id="32-架构总览">3.2 架构总览</h3>

<!-- 项目架构图 -->
<div align="center">
    <img src="/images/paper_images/01_torch_ssq_overview.png" width="95%" alt="Architecture" />
</div>
<p><br /></p>

<h3 id="33-关键算法翻译">3.3 关键算法翻译</h3>

<h4 id="gmw小波对数空间计算">GMW小波：对数空间计算</h4>

<p>原始实现使用对数变换避免大尺度时的数值溢出：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 原始 SSqueezepy 实现（Numba JIT）
# psizero = 2 * exp(-beta*ln(fo) + fo^gamma + beta*ln(w) - w^gamma)
</span><span class="n">log_psih</span> <span class="o">=</span> <span class="o">-</span><span class="n">beta</span> <span class="o">*</span> <span class="n">ln</span><span class="p">(</span><span class="n">fo</span><span class="p">)</span> <span class="o">+</span> <span class="n">fo</span><span class="o">**</span><span class="n">gamma</span> <span class="o">+</span> <span class="n">beta</span> <span class="o">*</span> <span class="n">log_w</span> <span class="o">-</span> <span class="n">w</span><span class="o">**</span><span class="n">gamma</span>

<span class="c1"># PyTorch 直译
</span><span class="n">log_psih</span> <span class="o">=</span> <span class="o">-</span><span class="n">beta</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="n">log</span><span class="p">(</span><span class="n">fo</span><span class="p">)</span> <span class="o">+</span> <span class="n">fo</span><span class="o">**</span><span class="n">gamma</span> <span class="o">+</span> <span class="n">beta</span> <span class="o">*</span> <span class="n">torch</span><span class="p">.</span><span class="n">log</span><span class="p">(</span><span class="n">w_safe</span><span class="p">)</span> <span class="o">-</span> <span class="n">w_safe</span><span class="o">**</span><span class="n">gamma</span>
<span class="n">psih</span> <span class="o">=</span> <span class="mf">2.0</span> <span class="o">*</span> <span class="n">torch</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="n">log_psih</span><span class="p">)</span>
</code></pre></div></div>

<p><strong>关键</strong>：直接使用 <code class="language-plaintext highlighter-rouge">w**beta * exp(-w**gamma)</code> 在大尺度时 <code class="language-plaintext highlighter-rouge">w</code> 巨大导致溢出至 ∞，对数空间避免了此问题。</p>

<h4 id="indexed_sumscatter-add替代numbacuda">indexed_sum：scatter-add替代Numba/CUDA</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 原始 Numba JIT（CPU）
</span><span class="o">@</span><span class="n">jit</span><span class="p">(</span><span class="n">nopython</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">parallel</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_indexed_sum_log_par</span><span class="p">(</span><span class="n">Wx</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">const</span><span class="p">,</span> <span class="n">vlmin</span><span class="p">,</span> <span class="n">dvl</span><span class="p">,</span> <span class="n">omax</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">prange</span><span class="p">(</span><span class="n">Wx</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>          <span class="c1"># 时间轴并行
</span>        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Wx</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>        <span class="c1"># 频率轴
</span>            <span class="n">k</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="nb">max</span><span class="p">((</span><span class="n">log2</span><span class="p">(</span><span class="n">w</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">])</span> <span class="o">-</span> <span class="n">vlmin</span><span class="p">)</span> <span class="o">/</span> <span class="n">dvl</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="n">omax</span><span class="p">))</span>
            <span class="n">out</span><span class="p">[</span><span class="n">k</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">Wx</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">const</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>  <span class="c1"># scatter-add
</span>
<span class="c1"># PyTorch 替代（使用 scatter_add）
</span><span class="k">def</span> <span class="nf">indexed_sum</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">out</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">out</span><span class="p">.</span><span class="n">scatter_add</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span>  <span class="c1"># GPU原生操作，支持autograd
</span></code></pre></div></div>

<hr />

<h2 id="4-定量验证">4. 定量验证</h2>

<h3 id="41-gmw小波验证">4.1 GMW小波验证</h3>

<!-- 小波验证图 -->
<div align="center">
    <img src="/images/paper_images/02_wavelet_verification.png" width="95%" alt="Wavelet" />
</div>
<p><br /></p>

<p>在4个尺度（0.5, 1.5, 5.0, 50.0）上对比torch_ssqueezepy与原始SSqueezepy的小波生成：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">尺度</th>
      <th style="text-align: center">最大绝对误差</th>
      <th style="text-align: center">状态</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">0.5</td>
      <td style="text-align: center">9.3 × 10⁻⁷</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">1.5</td>
      <td style="text-align: center">5.0 × 10⁻⁶</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">5.0</td>
      <td style="text-align: center">5.7 × 10⁻⁶</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td style="text-align: center">50.0</td>
      <td style="text-align: center">5.4 × 10⁻⁶</td>
      <td style="text-align: center">✅</td>
    </tr>
  </tbody>
</table>

<p><strong>结论</strong>：频域小波在4个数量级的尺度范围内与原始实现一致（误差 &lt; 6×10⁻⁶）。</p>

<h3 id="42-核心算法验证矩阵">4.2 核心算法验证矩阵</h3>

<table>
  <thead>
    <tr>
      <th>组件</th>
      <th>最大误差</th>
      <th style="text-align: center">状态</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GMW小波生成</td>
      <td>5.0 × 10⁻⁶</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td>FFT/IFFT</td>
      <td>3.3 × 10⁻¹⁴</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td>单尺度CWT卷积</td>
      <td>2.4 × 10⁻⁷</td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td>多尺度CWT（无padding）</td>
      <td>&lt; 1×10⁻⁵</td>
      <td style="text-align: center">✅</td>
    </tr>
  </tbody>
</table>

<h3 id="43-cwt综合对比">4.3 CWT综合对比</h3>

<!-- CWT对比图 -->
<div align="center">
    <img src="/images/paper_images/03_cwt_comparison.png" width="95%" alt="CWT" />
</div>
<p><br /></p>

<p>Panel (a) 展示内圈故障信号（BPFI=162Hz）的时域波形，冲击具有周期性但受转频（25Hz）幅度调制。(b) CWT时频图清晰显示冲击的宽频特性和周期性。(c) SSQ CWT进一步锐化频率分辨率，162Hz（BPFI）和324Hz（2×BPFI）的故障特征线清晰可见。(d) GMW滤波器组展示不同尺度的频率选择性。(e) CWT（蓝色）与SSQ（红色）叠加显示同步挤压的频率锐化效果。(f) 尺度能量分布揭示故障信号在不同频率尺度的能量集中度。</p>

<hr />

<h2 id="5-滚动轴承故障诊断可视化">5. 滚动轴承故障诊断可视化</h2>

<!-- 轴承故障分析 -->
<div align="center">
    <img src="/images/paper_images/04_bearing_analysis.png" width="95%" alt="Bearing" />
</div>
<p><br /></p>

<p>覆盖5种信号类型：</p>

<table>
  <thead>
    <tr>
      <th>#</th>
      <th>信号</th>
      <th>故障特征</th>
      <th>诊断关键</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>内圈故障 (BPFI=162Hz)</td>
      <td>冲击 + 转频调制</td>
      <td>SSQ清晰分离162Hz载波和边频带</td>
    </tr>
    <tr>
      <td>2</td>
      <td>外圈故障 (BPFO=108Hz)</td>
      <td>均匀周期性冲击</td>
      <td>CWT已能看出，SSQ进一步锐化</td>
    </tr>
    <tr>
      <td>3</td>
      <td>滚动体故障 (BSF=69Hz)</td>
      <td>双倍冲击频率</td>
      <td>时频脊线追踪滚动体通过频率</td>
    </tr>
    <tr>
      <td>4</td>
      <td>复合故障</td>
      <td>三故障叠加</td>
      <td>SSQ比CWT更清晰区分多分量</td>
    </tr>
    <tr>
      <td>5</td>
      <td>非平稳变速</td>
      <td>线性扫频 + 冲击</td>
      <td>变速工况下频率动态变化清晰可见</td>
    </tr>
  </tbody>
</table>

<p>每行展示：(左) 时域波形 → CWT时频图 → (中右) SSQ CWT + 故障特征频率标注 → (右) 提取的时频脊线。</p>

<hr />

<h2 id="6-ssq-vs-cwt-时频分辨率对比">6. SSQ vs CWT 时频分辨率对比</h2>

<!-- 分辨率对比 -->
<div align="center">
    <img src="/images/paper_images/05_ssq_vs_cwt_resolution.png" width="95%" alt="Resolution" />
</div>
<p><br /></p>

<p>从6个维度定量对比CWT与SSQ CWT的时频分辨率：</p>

<p><strong>(a) 信号局部放大</strong>：30ms附近的冲击细节。(b) CWT在该区域显示明显的频率扩散。(c) SSQ CWT将能量集中到更窄的频率带，BPFI（162Hz）清晰可见。(d) 频率切片（t=30ms）：SSQ在BPFI及其谐波处有更尖锐的峰值。(e) 时间切片（f≈162Hz）：SSQ更好地保留了冲击的时间定位。(f) 能量集中度曲线：SSQ的90%能量集中在更少的频率bin中，定量证明了频率锐化效果。</p>

<hr />

<h2 id="7-尺度能量分布">7. 尺度能量分布</h2>

<!-- 尺度能量分布 -->
<div align="center">
    <img src="/images/paper_images/06_scale_energy_distribution.png" width="95%" alt="Scale Energy" />
</div>
<p><br /></p>

<p>5种故障信号在CWT各尺度上的能量分布对比。不同故障类型表现出不同的优势频率区间：内圈故障能量集中在162Hz附近（BPFI），外圈故障集中在108Hz（BPFO），滚动体故障集中在69Hz（BSF）。复合故障同时呈现多个能量峰值。归一化对比图（右下）清晰区分了不同故障的频谱特征。这一分析直接支持将时频表示作为故障分类特征的有效性。</p>

<hr />

<h2 id="8-剩余工作与展望">8. 剩余工作与展望</h2>

<h3 id="81-工程对齐">8.1 工程对齐</h3>

<table>
  <thead>
    <tr>
      <th>项目</th>
      <th style="text-align: center">状态</th>
      <th>说明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CWT padding</td>
      <td style="text-align: center">⚠️</td>
      <td><code class="language-plaintext highlighter-rouge">torch.nn.functional.pad</code> vs 原始 <code class="language-plaintext highlighter-rouge">padsignal</code>，差~0.95</td>
    </tr>
    <tr>
      <td>STFT <code class="language-plaintext highlighter-rouge">_buffer</code></td>
      <td style="text-align: center">⚠️</td>
      <td><code class="language-plaintext highlighter-rouge">unfold</code> 实现需对齐原始窗口化逻辑</td>
    </tr>
    <tr>
      <td>L1归一化</td>
      <td style="text-align: center">⚠️</td>
      <td><code class="language-plaintext highlighter-rouge">sqrt(scale)</code> 近似 vs 原始积分推导系数</td>
    </tr>
    <tr>
      <td>GPU验证</td>
      <td style="text-align: center">⏳</td>
      <td>CUDA 12.4 whl被GFW封锁，待解决网络问题后下载</td>
    </tr>
  </tbody>
</table>

<h3 id="82-与tf-c集成路径">8.2 与TF-C集成路径</h3>

<p>torch_ssqueezepy 的 <code class="language-plaintext highlighter-rouge">nn</code> 模块提供可微的时频变换：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">torch_ssqueezepy.nn</span> <span class="kn">import</span> <span class="n">CWT</span><span class="p">,</span> <span class="n">SSQ_CWT</span>

<span class="c1"># 在TF-C频域分支中替换 fft.fft(x).abs()
</span><span class="n">cwt_layer</span> <span class="o">=</span> <span class="n">CWT</span><span class="p">(</span><span class="n">wavelet</span><span class="o">=</span><span class="s">'gmw'</span><span class="p">,</span> <span class="n">nv</span><span class="o">=</span><span class="mi">32</span><span class="p">,</span> <span class="n">derivative</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">ssq_layer</span> <span class="o">=</span> <span class="n">SSQ_CWT</span><span class="p">(</span><span class="n">wavelet</span><span class="o">=</span><span class="s">'gmw'</span><span class="p">,</span> <span class="n">nv</span><span class="o">=</span><span class="mi">32</span><span class="p">,</span> <span class="n">gamma</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">)</span>

<span class="c1"># 输出保持 [B, C, T] 兼容现有模型
</span><span class="n">Tx</span><span class="p">,</span> <span class="n">Wx</span><span class="p">,</span> <span class="n">freqs</span> <span class="o">=</span> <span class="n">ssq_layer</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>  <span class="c1"># Tx: [B, nf, T]
</span></code></pre></div></div>

<h3 id="83-triton内核加速">8.3 Triton内核加速</h3>

<p><code class="language-plaintext highlighter-rouge">indexed_sum</code> 的 <code class="language-plaintext highlighter-rouge">scatter_add</code> 在当前规模下可用，但大规模数据下建议使用Triton编写定制内核：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">@</span><span class="n">triton</span><span class="p">.</span><span class="n">jit</span>
<span class="k">def</span> <span class="nf">indexed_sum_kernel</span><span class="p">(</span><span class="n">Wx_ptr</span><span class="p">,</span> <span class="n">w_ptr</span><span class="p">,</span> <span class="n">out_ptr</span><span class="p">,</span> <span class="p">...):</span>
    <span class="n">pid</span> <span class="o">=</span> <span class="n">tl</span><span class="p">.</span><span class="n">program_id</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N_scales</span><span class="p">):</span>
        <span class="n">k</span> <span class="o">=</span> <span class="n">compute_bin</span><span class="p">(</span><span class="n">w</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">pid</span><span class="p">],</span> <span class="p">...)</span>
        <span class="n">tl</span><span class="p">.</span><span class="n">atomic_add</span><span class="p">(</span><span class="n">out_ptr</span> <span class="o">+</span> <span class="n">k</span> <span class="o">*</span> <span class="n">N_times</span> <span class="o">+</span> <span class="n">pid</span><span class="p">,</span> <span class="n">Wx</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">pid</span><span class="p">])</span>
</code></pre></div></div>

<hr />

<h2 id="9-结论">9. 结论</h2>

<ol>
  <li><strong>SSqueezepy纯PyTorch重构完全可行</strong>。GMW小波、FFT/IFFT、CWT卷积的核心算法已100%验证通过（误差 &lt; 10⁻⁵量级）。</li>
  <li><strong>同步挤压变换（SSQ）显著优于普通CWT</strong>用于非平稳信号的时频分析，在滚动轴承故障诊断中能清晰分辨BPFI/BPFO/BSF等特征频率及其谐波。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">indexed_sum</code>是唯一需要特殊处理的瓶颈</strong>，<code class="language-plaintext highlighter-rouge">torch.scatter_add</code>在当前规模下可用，大规模推荐Triton内核。</li>
  <li><strong>torch_ssqueezepy.nn模块</strong>可直接嵌入TF-C等深度学习框架，实现可微的时频表示学习。</li>
</ol>

<hr />

<h2 id="参考文献">参考文献</h2>

<p>[1] Muradeli J. ssqueezepy: Synchrosqueezing, wavelet transforms, and time-frequency analysis in Python. GitHub: OverLordGoldDragon/ssqueezepy, v0.6.6.</p>

<p>[2] Zhang X, Zhao Z, Tsiligkaridis T, et al. Self-supervised contrastive pre-training for time series via time-frequency consistency. <em>NeurIPS</em>, 2022.</p>

<p>[3] Lilly J M, Olhede S C. Generalized Morse wavelets as a superfamily of analytic wavelets. <em>IEEE TSP</em>, 2012, 60(11): 6032-6047.</p>

<p>[4] Thakur G, Brevdo E, Fučkar N S, et al. The synchrosqueezing algorithm for time-varying spectral analysis: robustness properties and new paleoclimate applications. <em>Signal Processing</em>, 2013, 93(5): 1079-1094.</p>

<p>[5] Daubechies I, Lu J, Wu H T. Synchrosqueezed wavelet transforms: An empirical mode decomposition-like tool. <em>Applied and Computational Harmonic Analysis</em>, 2011, 30(2): 243-261.</p>

<hr />

<ul>
  <li>SSqueezepy: https://github.com/OverLordGoldDragon/ssqueezepy</li>
  <li>torch_ssqueezepy: 本工作</li>
  <li>TFC-pretraining: https://github.com/mims-harvard/TFC-pretraining</li>
</ul>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="PaperNote" /><category term="TFC" /><category term="Time-Frequency-Analysis" /><category term="Non-Stationary-Signal" /><category term="Bearing-Fault-Diagnosis" /><category term="SSqueezepy" /><category term="PyTorch" /><category term="Synchrosqueezing" /><category term="CWT" /><category term="STFT" /><category term="GMW" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://liuyirigel.github.io/images/paper_images/04_bearing_analysis.png" /><media:content medium="image" url="https://liuyirigel.github.io/images/paper_images/04_bearing_analysis.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[工程笔记] TFC非平稳信号适配：可微时频变换模块的设计、优化与可视化验证</title><link href="https://liuyirigel.github.io/posts/2026/05/paper-note-6/" rel="alternate" type="text/html" title="[工程笔记] TFC非平稳信号适配：可微时频变换模块的设计、优化与可视化验证" /><published>2026-05-13T00:00:00+00:00</published><updated>2026-05-13T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/05/paper-note-6</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/05/paper-note-6/"><![CDATA[<div align="center">
    <img src="../images/paper_images/05_2d_all_methods_grid.png" style="width: 85%; 
                border-radius: 5px; 
                box-shadow: 0 10px 20px rgba(0,0,0,0.2); 
                border: 1px solid #eee;" />
</div>
<p><br /></p>

<p>\images\paper_images\05_2d_all_methods_grid.png</p>

<p>对TF-C预训练框架进行非平稳信号适配的完整工程记录。包括数据输入结构分析、SSqueezepy集成可行性评估、4种可微频域变换模块的设计、GMW小波核的参数优化、以及与SSqueezepy等价CWT的定量对比验证。</p>

<hr />

<h2 id="1-背景与动机">1. 背景与动机</h2>

<p>TF-C [1] 通过时域编码器和频域编码器的对比学习实现时间序列自监督预训练。但其频域分支采用 <code class="language-plaintext highlighter-rouge">torch.fft.fft</code> 做全局傅里叶变换，隐含平稳性假设。对于滚动轴承振动信号这类典型非平稳信号，故障冲击具有瞬态性和时变频谱特征，全局FFT无法刻画其时频局部特性。</p>

<p><strong>本文目标</strong>：在保持TF-C训练框架的前提下，设计可替换FFT的频域变换模块。</p>

<hr />

<h2 id="2-tf-c-数据输入结构分析">2. TF-C 数据输入结构分析</h2>

<h3 id="数据流">数据流</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CSV/原始信号 → {"samples": tensor, "labels": tensor}
    ↓ torch.load("train.pt")
Load_Dataset.__init__()
    ├── 统一shape → [N, 1, TSlength_aligned]
    ├── 频域变换 → x_data_f (同shape)
    └── 预训练时附加时域+频域增广
        ↓ __getitem__
5项输出: (x_data, y, aug1, x_data_f, aug1_f)
    ↓ DataLoader → [B,1,T]×5
model.forward()
    ├── x_data   → TransformerEncoder_t → z_time
    ├── x_data_f → TransformerEncoder_f → z_freq
</code></pre></div></div>

<h3 id="关键约束">关键约束</h3>

<table>
  <thead>
    <tr>
      <th>约束项</th>
      <th>规范</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>数据文件格式</td>
      <td><code class="language-plaintext highlighter-rouge">dict{"samples": tensor, "labels": tensor}</code>，<code class="language-plaintext highlighter-rouge">torch.save</code> 存为 <code class="language-plaintext highlighter-rouge">.pt</code></td>
    </tr>
    <tr>
      <td>samples 形状</td>
      <td><code class="language-plaintext highlighter-rouge">[N, 1, T]</code>，channel 在 dim=1</td>
    </tr>
    <tr>
      <td>labels 形状</td>
      <td><code class="language-plaintext highlighter-rouge">[N]</code>，<code class="language-plaintext highlighter-rouge">dtype=torch.long</code>，从0开始编号</td>
    </tr>
    <tr>
      <td>T 对齐</td>
      <td>取前 <code class="language-plaintext highlighter-rouge">config.TSlength_aligned</code> 个采样点</td>
    </tr>
  </tbody>
</table>

<h3 id="transformer-对维度的硬约束">Transformer 对维度的硬约束</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># model.py L9
</span><span class="n">encoder_layers_t</span> <span class="o">=</span> <span class="n">TransformerEncoderLayer</span><span class="p">(</span>
    <span class="n">configs</span><span class="p">.</span><span class="n">TSlength_aligned</span><span class="p">,</span>   <span class="c1"># ← 输入维度必须等于 T
</span>    <span class="n">dim_feedforward</span><span class="o">=</span><span class="mi">2</span> <span class="o">*</span> <span class="n">configs</span><span class="p">.</span><span class="n">TSlength_aligned</span><span class="p">,</span> <span class="n">nhead</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
</code></pre></div></div>

<hr />

<h2 id="3-ssqueezepy-集成可行性评估">3. SSqueezepy 集成可行性评估</h2>

<p>SSqueezepy [2] 提供 CWT、STFT、同步压缩变换（SSQ）。</p>

<table>
  <thead>
    <tr>
      <th>函数</th>
      <th>输出形状</th>
      <th>计算后端</th>
      <th style="text-align: center">autograd</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cwt(x)</code></td>
      <td><code class="language-plaintext highlighter-rouge">[na, n]</code></td>
      <td>NumPy + Numba</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">stft(x)</code></td>
      <td><code class="language-plaintext highlighter-rouge">[nf, nt]</code></td>
      <td>NumPy + SciPy</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ssq_cwt(x)</code></td>
      <td><code class="language-plaintext highlighter-rouge">[nf, n]</code></td>
      <td>NumPy + Numba</td>
      <td style="text-align: center">❌</td>
    </tr>
  </tbody>
</table>

<p><strong>不可行因素</strong>：(1) 不可微；(2) CWT输出<code class="language-plaintext highlighter-rouge">[na,n]</code>与Transformer要求的<code class="language-plaintext highlighter-rouge">[B,1,T]</code>不兼容；(3) Numba与NumPy 2.x冲突。</p>

<p><strong>结论</strong>：SSqueezepy不适合直接集成，但其GMW小波算法可翻译为PyTorch原生实现。</p>

<hr />

<h2 id="4-可微频域变换模块设计">4. 可微频域变换模块设计</h2>

<p>实现于 <code class="language-plaintext highlighter-rouge">freq_transforms.py</code>，统一满足 <code class="language-plaintext highlighter-rouge">[B,C,T]→[B,C,T]</code> 且可微。</p>

<h3 id="41-multiscalefft">4.1 MultiScaleFFT</h3>

<p>多窗口STFT幅度加权融合：</p>

\[\text{Mag}_k = \text{Interp}_T\left(\frac{1}{N_{\text{freq}}}\sum_{f} |\text{STFT}_{w_k}(x)|\right),\quad \text{out} = \sum_k \alpha_k \cdot \text{Mag}_k\]

<p>\(\alpha_k = \text{softmax}(\theta_k)\)，短窗捕获瞬态冲击，长窗保留周期成分。</p>

<h3 id="42-cwt_approx-v2gmw小波滤波器组">4.2 CWT_Approx v2：GMW小波滤波器组</h3>

<p><strong>v1→v2 改进</strong>：将v1的简单Morlet小波替换为SSqueezepy使用的 <strong>Generalized Morse Wavelet (GMW)</strong>：</p>

\[\psi(\omega) = U(\omega) \cdot \omega^{\beta} \cdot \exp(-\omega^{\gamma})\]

<p>其中 \(U(\omega)\) 为Heaviside阶跃函数，\(\beta\) 控制时间域窄度，\(\gamma\) 控制频率域窄度。</p>

<p><strong>关键改进</strong>：GMW核替代Morlet；向量化计算（所有尺度并行）；默认96个尺度（v1仅32个）；半Nyquist处理（SSqueezepy约定）；Energy pooling（均值池化）替代max pooling。</p>

<p><strong>前向计算</strong>：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>x [B,C,T] → FFT → [B,C,T]_complex
                        ↓ × Ψ(ω; s_i, β, γ) [n_scales, T]
              [B,C,n_scales,T]_complex
                        ↓ IFFT
              [B,C,n_scales,T] → |·| → mean(dim=2) → [B,C,T]
</code></pre></div></div>

<h3 id="43-stft_pool">4.3 STFT_Pool</h3>

<table>
  <tbody>
    <tr>
      <td>$$\text{out} = \text{Interp}<em>T\left(\sum</em>{f} w_f \cdot</td>
      <td>\text{STFT}(x)</td>
      <td>_{f, :}\right)\(，可学习频率权重\){w_f}$$。</td>
    </tr>
  </tbody>
</table>

<h3 id="44-envelopefft">4.4 EnvelopeFFT</h3>

<p>Hilbert包络解调+FFT幅度谱加权融合：</p>

\[\text{env} = |\mathcal{F}^{-1}\{\mathcal{F}(x) \odot H(\omega)\}|,\quad \text{out} = \sigma(\alpha) \cdot |\mathcal{F}(x)| + (1 - \sigma(\alpha)) \cdot \text{env\_spec}\]

<p>包络谱对轴承故障调制频率敏感。</p>

<h3 id="45-变换对比">4.5 变换对比</h3>

<table>
  <thead>
    <tr>
      <th>变换</th>
      <th style="text-align: center">非平稳适用性</th>
      <th style="text-align: center">可学习参数</th>
      <th>适用场景</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>FFT（原始）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">0</td>
      <td>平稳信号</td>
    </tr>
    <tr>
      <td>MultiScaleFFT</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">#windows+1</td>
      <td>多分辨率分析</td>
    </tr>
    <tr>
      <td>CWT_Approx v2</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">n_scales+2</td>
      <td>自适应时频</td>
    </tr>
    <tr>
      <td>STFT_Pool</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">n_freq</td>
      <td>轻量时频</td>
    </tr>
    <tr>
      <td>EnvelopeFFT</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">1</td>
      <td>轴承故障诊断</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="5-测试信号设计">5. 测试信号设计</h2>

<p>5类信号（N=2048, fs=1000 Hz），含噪信号统一SNR=5dB：</p>

<table>
  <thead>
    <tr>
      <th>#</th>
      <th>信号</th>
      <th>数学描述</th>
      <th style="text-align: center">SNR</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>单频正弦</td>
      <td>\(\sin(2\pi \cdot 10t)\)</td>
      <td style="text-align: center">∞</td>
    </tr>
    <tr>
      <td>2</td>
      <td>线性调频</td>
      <td>\(\sin(2\pi(10t + \frac{190}{2.048}t^2))\), 10→200Hz</td>
      <td style="text-align: center">∞</td>
    </tr>
    <tr>
      <td>3</td>
      <td>单频+噪声</td>
      <td>信号1 + AWGN</td>
      <td style="text-align: center">5 dB</td>
    </tr>
    <tr>
      <td>4</td>
      <td>调频+噪声</td>
      <td>信号2 + AWGN</td>
      <td style="text-align: center">5 dB</td>
    </tr>
    <tr>
      <td>5</td>
      <td>轴承故障+噪声</td>
      <td>BPFO=60Hz + 共振调制 + AWGN</td>
      <td style="text-align: center">5 dB</td>
    </tr>
  </tbody>
</table>

<h3 id="时域波形">时域波形</h3>

<!-- ![时域信号](../images/paper_images/01_signals_time_domain.png) -->

<div align="center">
    <img src="/images/paper_images/01_signals_time_domain.png" width="95%" alt="img" />
</div>
<p><br /></p>

<hr />

<h2 id="6-1d频域表示">6. 1D频域表示</h2>

<h3 id="按信号分组55矩阵">按信号分组（5×5矩阵）</h3>

<!-- ![1D频域表示矩阵](../images/paper_images/02_all_transforms_grid.png) -->

<div align="center">
    <img src="/images/paper_images/02_all_transforms_grid.png" width="95%" alt="img" />
</div>
<p><br /></p>

<h3 id="envelopefft-示例">EnvelopeFFT 示例</h3>

<!-- ![EnvelopeFFT 对比](../images/paper_images/03_method_envelope_comparison.png) -->

<div align="center">
    <img src="/images/paper_images/03_method_envelope_comparison.png" width="95%" alt="img" />
</div>
<p><br /></p>

<hr />

<h2 id="7-2d时频表示">7. 2D时频表示</h2>

<h3 id="总览矩阵5方法5信号">总览矩阵（5方法×5信号）</h3>

<!-- ![2D时频总览](../images/paper_images/05_2d_all_methods_grid.png) -->

<div align="center">
    <img src="/images/paper_images/05_2d_all_methods_grid.png" width="95%" alt="img" />
</div>
<p><br /></p>

<h3 id="cwt_approx-v2-时频图">CWT_Approx v2 时频图</h3>

<!-- ![CWT_Approx v2 2D](../images/paper_images/05_2d_CWT_Approx.png) -->

<div align="center">
    <img src="/images/paper_images/05_2d_CWT_Approx.png" width="95%" alt="img" />
</div>
<p><br /></p>

<h3 id="envelopefft-时频图">EnvelopeFFT 时频图</h3>

<!-- ![EnvelopeFFT 2D](../images/paper_images/05_2d_EnvelopeFFT.png) -->

<div align="center">
    <img src="/images/paper_images/05_2d_EnvelopeFFT.png" width="95%" alt="img" />
</div>
<p><br /></p>

<hr />

<h2 id="8-ssqueezepy-等价-cwt-对比验证">8. SSqueezepy 等价 CWT 对比验证</h2>

<p>由于SSqueezepy在当前环境（NumPy 2.x + Numba冲突）无法直接导入，我们基于其 <code class="language-plaintext highlighter-rouge">_cwt.py</code> 源码实现了<strong>等价的GMW CWT算法</strong>（纯NumPy，320个尺度，nv=32），用于定量对标。</p>

<h3 id="ssqueezepy-cwt-二维时频图">SSqueezepy CWT 二维时频图</h3>

<!-- ![SSqueezepy CWT 2D](../images/paper_images/06_ssq_cwt_2d.png) -->

<h3 id="ssqueezepy-cwt-vs-cwt_approx">SSqueezepy CWT vs CWT_Approx</h3>

<!-- ![SSQ vs 我们的 CWT](../images/paper_images/06_ssq_vs_ours_comparison.png) -->

<div align="center">
    <img src="/images/paper_images/06_ssq_vs_ours_comparison.png" width="95%" alt="img" />
</div>
<p><br /></p>

<p>橙色为SSqueezepy等价CWT（max projection over 320 scales），蓝色为CWT_Approx（energy pooling over 96 scales）。两者在能量分布趋势上高度一致。</p>

<h3 id="尺度能量分布">尺度能量分布</h3>

<!-- ![尺度能量](../images/paper_images/06_ssq_cwt_scale_energy.png) -->

<div align="center">
    <img src="/images/paper_images/06_ssq_cwt_scale_energy.png" width="95%" alt="img" />
</div>
<p><br /></p>

<hr />

<h2 id="9-参数传递与配置集成">9. 参数传递与配置集成</h2>

<h3 id="工厂函数调用">工厂函数调用</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">freq_transforms</span> <span class="kn">import</span> <span class="n">get_freq_transform</span>

<span class="n">transform</span> <span class="o">=</span> <span class="n">get_freq_transform</span><span class="p">(</span>
    <span class="s">'cwt_approx'</span><span class="p">,</span>          <span class="c1"># 变换类型
</span>    <span class="n">n_samples</span><span class="o">=</span><span class="mi">178</span><span class="p">,</span>         <span class="c1"># TSlength_aligned
</span>    <span class="n">n_scales</span><span class="o">=</span><span class="mi">96</span><span class="p">,</span>           <span class="c1"># 尺度数 (推荐≥48)
</span>    <span class="n">beta_init</span><span class="o">=</span><span class="mf">3.0</span><span class="p">,</span>         <span class="c1"># GMW β (时间域窄度)
</span>    <span class="n">gamma_init</span><span class="o">=</span><span class="mf">6.0</span><span class="p">,</span>        <span class="c1"># GMW γ (频率域窄度)
</span>    <span class="n">pooling</span><span class="o">=</span><span class="s">'energy'</span><span class="p">,</span>      <span class="c1"># 'energy' | 'max' | 'weighted'
</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="配置文件">配置文件</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># config_files/XXX_Configs.py
</span><span class="bp">self</span><span class="p">.</span><span class="n">freq_transform_type</span> <span class="o">=</span> <span class="s">'cwt_approx'</span>  <span class="c1"># 选择变换类型
</span></code></pre></div></div>

<h3 id="dataloaderpy-自动集成">dataloader.py 自动集成</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">freq_transform</span> <span class="o">=</span> <span class="n">get_freq_transform</span><span class="p">(</span>
    <span class="nb">getattr</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="s">'freq_transform_type'</span><span class="p">,</span> <span class="s">'fft'</span><span class="p">),</span>
    <span class="n">n_samples</span><span class="o">=</span><span class="n">window_length</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">x_data_f</span> <span class="o">=</span> <span class="p">(</span><span class="n">freq_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">x_data</span><span class="p">)</span> <span class="k">if</span> <span class="n">freq_transform</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span>
                 <span class="k">else</span> <span class="n">fft</span><span class="p">.</span><span class="n">fft</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">x_data</span><span class="p">).</span><span class="nb">abs</span><span class="p">())</span>
</code></pre></div></div>

<hr />

<h2 id="10-所有可视化文件清单">10. 所有可视化文件清单</h2>

<table>
  <thead>
    <tr>
      <th>类别</th>
      <th>文件</th>
      <th>内容</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>时域</td>
      <td><code class="language-plaintext highlighter-rouge">01_signals_time_domain.png</code></td>
      <td>5信号时域波形</td>
    </tr>
    <tr>
      <td>1D矩阵</td>
      <td><code class="language-plaintext highlighter-rouge">02_all_transforms_grid.png</code></td>
      <td>5×5 方法×信号矩阵</td>
    </tr>
    <tr>
      <td>1D方法</td>
      <td><code class="language-plaintext highlighter-rouge">03_method_*_comparison.png</code></td>
      <td>每种方法的5信号对比 (×5)</td>
    </tr>
    <tr>
      <td>2D</td>
      <td><code class="language-plaintext highlighter-rouge">04_stft_spectrograms.png</code></td>
      <td>标准STFT参考</td>
    </tr>
    <tr>
      <td>2D</td>
      <td><code class="language-plaintext highlighter-rouge">05_2d_all_methods_grid.png</code></td>
      <td>5×5 2D总览</td>
    </tr>
    <tr>
      <td>2D</td>
      <td><code class="language-plaintext highlighter-rouge">05_2d_*.png</code></td>
      <td>每种方法的2D时频图 (×5)</td>
    </tr>
    <tr>
      <td>SSQ</td>
      <td><code class="language-plaintext highlighter-rouge">06_ssq_cwt_2d.png</code></td>
      <td>SSqueezepy CWT 2D</td>
    </tr>
    <tr>
      <td>SSQ</td>
      <td><code class="language-plaintext highlighter-rouge">06_ssq_vs_ours_comparison.png</code></td>
      <td>⭐ SSqueezepy vs CWT_Approx v2</td>
    </tr>
    <tr>
      <td>SSQ</td>
      <td><code class="language-plaintext highlighter-rouge">06_ssq_cwt_scale_energy.png</code></td>
      <td>尺度能量分布</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="参考文献">参考文献</h2>

<p>[1] Zhang X, Zhao Z, Tsiligkaridis T, et al. Self-supervised contrastive pre-training for time series via time-frequency consistency. <em>NeurIPS</em>, 2022.</p>

<p>[2] Muradeli J. ssqueezepy: Synchrosqueezing, wavelet transforms, and time-frequency analysis in Python. GitHub: OverLordGoldDragon/ssqueezepy, v0.6.6.</p>

<p>[3] Lilly J M, Olhede S C. Generalized Morse wavelets as a superfamily of analytic wavelets. <em>IEEE TSP</em>, 2012.</p>

<hr />

<ul>
  <li>TF-C 源码: https://github.com/mims-harvard/TFC-pretraining</li>
  <li>SSqueezepy: https://github.com/OverLordGoldDragon/ssqueezepy</li>
  <li>本文实现: <code class="language-plaintext highlighter-rouge">AE_WorkZone/TFC-pretraining/code/TFC/freq_transforms.py</code></li>
  <li>测试脚本: <code class="language-plaintext highlighter-rouge">AE_WorkZone/TFC-pretraining/code/TFC/tests/</code></li>
</ul>

<p>TF-C [1] 通过时域编码器和频域编码器的对比学习实现时间序列自监督预训练，在EEG、HAR、ECG等数据集上表现优异。但其频域分支采用 <code class="language-plaintext highlighter-rouge">torch.fft.fft</code> 做全局傅里叶变换，隐含平稳性假设。对于滚动轴承振动信号这类典型非平稳信号，故障冲击具有瞬态性和时变频谱特征，全局FFT无法刻画其时频局部特性。</p>

<p><strong>本文目标</strong>：在保持TF-C训练框架（端到端可微、形状兼容 <code class="language-plaintext highlighter-rouge">[B,C,T]→[B,C,T]</code>）的前提下，设计可替换FFT的频域变换模块，适配非平稳信号分析。</p>

<hr />

<h2 id="2-tf-c-数据输入结构分析-1">2. TF-C 数据输入结构分析</h2>

<h3 id="21-数据流">2.1 数据流</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CSV/原始信号 → {"samples": tensor, "labels": tensor}
    ↓ torch.load("train.pt")
Load_Dataset.__init__()
    ├── 统一shape → [N, 1, TSlength_aligned]
    ├── 频域变换 → x_data_f (同shape)
    └── 预训练时附加时域+频域增广
        ↓ __getitem__
5项输出: (x_data, y, aug1, x_data_f, aug1_f)
    ↓ DataLoader → [B,1,T]×5
model.forward()
    ├── x_data   → TransformerEncoder_t → z_time
    ├── x_data_f → TransformerEncoder_f → z_freq
    ├── aug1     → TransformerEncoder_t → z_time_aug
    └── aug1_f   → TransformerEncoder_f → z_freq_aug
</code></pre></div></div>

<h3 id="22-关键约束">2.2 关键约束</h3>

<table>
  <thead>
    <tr>
      <th>约束项</th>
      <th>规范</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>数据文件格式</td>
      <td><code class="language-plaintext highlighter-rouge">dict{"samples": tensor, "labels": tensor}</code>，<code class="language-plaintext highlighter-rouge">torch.save</code> 存为 <code class="language-plaintext highlighter-rouge">.pt</code></td>
    </tr>
    <tr>
      <td>samples 形状</td>
      <td><code class="language-plaintext highlighter-rouge">[N, 1, T]</code>，channel 在 dim=1</td>
    </tr>
    <tr>
      <td>labels 形状</td>
      <td><code class="language-plaintext highlighter-rouge">[N]</code>，<code class="language-plaintext highlighter-rouge">dtype=torch.long</code>，从0开始编号</td>
    </tr>
    <tr>
      <td>T 对齐</td>
      <td>取前 <code class="language-plaintext highlighter-rouge">config.TSlength_aligned</code> 个采样点</td>
    </tr>
    <tr>
      <td>预训练集规模</td>
      <td>建议 &gt;10⁵ 样本（SleepEEG: 371,055）</td>
    </tr>
    <tr>
      <td>微调集规模</td>
      <td>典型 60–120 样本，每类均衡</td>
    </tr>
  </tbody>
</table>

<h3 id="23-transformer-对维度的硬约束">2.3 Transformer 对维度的硬约束</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># model.py L9
</span><span class="n">encoder_layers_t</span> <span class="o">=</span> <span class="n">TransformerEncoderLayer</span><span class="p">(</span>
    <span class="n">configs</span><span class="p">.</span><span class="n">TSlength_aligned</span><span class="p">,</span>   <span class="c1"># ← 输入维度必须等于 T
</span>    <span class="n">dim_feedforward</span><span class="o">=</span><span class="mi">2</span> <span class="o">*</span> <span class="n">configs</span><span class="p">.</span><span class="n">TSlength_aligned</span><span class="p">,</span>
    <span class="n">nhead</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
</code></pre></div></div>

<p>因此<strong>频域变换的输出维度必须恒等于 <code class="language-plaintext highlighter-rouge">T</code></strong>（不能像标准CWT那样输出 <code class="language-plaintext highlighter-rouge">[na, T]</code> 二维时频图）。</p>

<h3 id="24-各数据集-t-参数">2.4 各数据集 T 参数</h3>

<table>
  <thead>
    <tr>
      <th>数据集</th>
      <th style="text-align: center">TSlength_aligned</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SleepEEG</td>
      <td style="text-align: center">178</td>
    </tr>
    <tr>
      <td>Epilepsy</td>
      <td style="text-align: center">178</td>
    </tr>
    <tr>
      <td>FD_A</td>
      <td style="text-align: center">5120</td>
    </tr>
    <tr>
      <td>HAR</td>
      <td style="text-align: center">206</td>
    </tr>
    <tr>
      <td>ECG</td>
      <td style="text-align: center">1500</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="3-ssqueezepy-集成可行性评估-1">3. SSqueezepy 集成可行性评估</h2>

<h3 id="31-ssqueezepy-能力矩阵">3.1 SSqueezepy 能力矩阵</h3>

<p>SSqueezepy [2] 是一个高质量的时频分析库，提供 CWT、STFT、同步压缩变换（SSQ）及其可视化。</p>

<table>
  <thead>
    <tr>
      <th>函数</th>
      <th>输出形状</th>
      <th>计算后端</th>
      <th style="text-align: center">autograd</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cwt(x)</code></td>
      <td><code class="language-plaintext highlighter-rouge">[na, n]</code></td>
      <td>NumPy + Numba</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">stft(x)</code></td>
      <td><code class="language-plaintext highlighter-rouge">[nf, nt]</code></td>
      <td>NumPy + SciPy</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ssq_cwt(x)</code></td>
      <td><code class="language-plaintext highlighter-rouge">[nf, n]</code></td>
      <td>NumPy + Numba</td>
      <td style="text-align: center">❌</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ssq_stft(x)</code></td>
      <td><code class="language-plaintext highlighter-rouge">[nf, nt]</code></td>
      <td>NumPy + SciPy</td>
      <td style="text-align: center">❌</td>
    </tr>
  </tbody>
</table>

<h3 id="32-不可行因素">3.2 不可行因素</h3>

<ol>
  <li><strong>不可微</strong>：核心计算基于 NumPy/Numba，无法嵌入 PyTorch 计算图。TF-C 的预训练需要梯度回传，频域变换必须是 <code class="language-plaintext highlighter-rouge">nn.Module</code>。</li>
  <li><strong>形状不兼容</strong>：CWT 输出 <code class="language-plaintext highlighter-rouge">[na, n]</code>（na ≈ 32–64 个尺度），与 Transformer 要求的 <code class="language-plaintext highlighter-rouge">[B, 1, T]</code> 不匹配。</li>
  <li><strong>计算效率</strong>：Numba JIT 首次编译开销大，不适合嵌入 DataLoader 的 <code class="language-plaintext highlighter-rouge">__init__</code>。</li>
  <li><strong>环境依赖重</strong>：本工作环境 NumPy 2.x 与 Numba 不兼容（Numba ≤2.1 required），进一步降低可用性。</li>
</ol>

<p><strong>结论</strong>：SSqueezepy 不适合直接集成，但其算法原理（频域小波滤波器组）可以翻译为 PyTorch 原生实现。</p>

<hr />

<h2 id="4-可微频域变换模块设计-1">4. 可微频域变换模块设计</h2>

<p>基于上述分析，设计并实现了 4 种 PyTorch 原生频域变换，统一满足 <code class="language-plaintext highlighter-rouge">[B,C,T]→[B,C,T]</code> 且可微的约束。</p>

<h3 id="41-multiscalefft多尺度窗fft">4.1 MultiScaleFFT：多尺度窗FFT</h3>

<p><strong>原理</strong>：用多个窗口尺寸（如 8, 16, 32, 64）分别计算STFT幅度，加权融合后插值回原长。</p>

\[\text{Mag}_k = \text{Interp}_T\left(\frac{1}{N_{\text{freq}}}\sum_{f} |\text{STFT}_{w_k}(x)|\right)\]

\[\text{out} = \sum_k \alpha_k \cdot \text{Mag}_k, \quad \alpha_k = \text{softmax}(\theta_k)\]

<p>其中 \(\{w_k\}\) 为多尺度窗集合，\(\{\theta_k\}\) 为可学习权重。</p>

<p><strong>特点</strong>：短窗捕获瞬态冲击，长窗保留周期成分，可学习权重自适应调节分辨率。</p>

<h3 id="42-cwt_approx可学习近似cwt">4.2 CWT_Approx：可学习近似CWT</h3>

<p><strong>原理</strong>：将 SSqueezepy <code class="language-plaintext highlighter-rouge">_cwt.py</code> 的核心逻辑翻译为 PyTorch——频域构造Morlet小波滤波器组，与信号FFT逐元素相乘后IFFT恢复时域，在尺度维度取最大值池化。</p>

<p><strong>频域Morlet小波</strong>：</p>

\[\psi(\omega; s) = \exp\left(-\frac{\sigma^2}{2} (\omega - \frac{\mu}{s})^2\right)\]

<p>其中 \(s \in \{s_1, \dots, s_{n_a}\}\) 为对数分布的可学习尺度参数，\(\mu\) 和 \(\sigma\) 均可学习。</p>

<p><strong>前向计算</strong>：</p>

\[\text{CWT}[i] = |\mathcal{F}^{-1}\{\mathcal{F}(x) \odot \psi(\omega; s_i)\}|, \quad i \in [1, n_a]\]

\[\text{out}[t] = \max_i \text{CWT}[i, t]\]

<p><strong>特点</strong>：尺度参数通过 NTXentLoss 反向传播优化，自动适配信号的时变频谱特性。</p>

<h3 id="43-stft_poolstft频域池化">4.3 STFT_Pool：STFT频域池化</h3>

<p><strong>原理</strong>：计算 STFT 幅度谱，通过可学习频率权重池化到1D，插值回原长。</p>

\[\text{out} = \text{Interp}_T\left(\sum_{f} w_f \cdot |\text{STFT}(x)|_{f, :}\right)\]

<p>其中 \(\{w_f\}\) 为可学习频率权重（softmax归一化）。</p>

<p><strong>特点</strong>：保留局部时频信息，通过加权机制突出故障特征频带。</p>

<h3 id="44-envelopefft包络谱融合fft">4.4 EnvelopeFFT：包络谱融合FFT</h3>

<p><strong>原理</strong>：受轴承故障诊断启发——Hilbert包络解调后做FFT获得包络谱，与原始FFT幅度谱加权融合。</p>

<p><strong>Hilbert包络</strong>：</p>

\[x_{\text{analytic}} = \mathcal{F}^{-1}\{\mathcal{F}(x) \odot H(\omega)\}, \quad H(\omega) = 
\begin{cases}
1, &amp; \omega = 0 \\
2, &amp; 0 &lt; \omega &lt; \pi \\
1, &amp; \omega = \pi \text{ (Nyquist)}
\end{cases}\]

\[\text{env} = |x_{\text{analytic}}|, \quad \text{env\_spec} = |\mathcal{F}(\text{env})|\]

<p><strong>融合</strong>：</p>

\[\text{out} = \sigma(\alpha) \cdot |\mathcal{F}(x)| + (1 - \sigma(\alpha)) \cdot \text{env\_spec}\]

<p>其中 \(\alpha\) 为可学习融合权重。</p>

<p><strong>特点</strong>：包络谱对轴承故障调制频率（BPFO、BPFI等）敏感，是故障诊断领域金标准特征。</p>

<h3 id="45-变换对比-1">4.5 变换对比</h3>

<table>
  <thead>
    <tr>
      <th>变换</th>
      <th style="text-align: center">非平稳适用性</th>
      <th style="text-align: center">可学习参数</th>
      <th style="text-align: center">计算复杂度</th>
      <th>适用场景</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>FFT（原始）</td>
      <td style="text-align: center">❌</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">O(N log N)</td>
      <td>平稳信号</td>
    </tr>
    <tr>
      <td>MultiScaleFFT</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">#windows + 1</td>
      <td style="text-align: center">O(Σ N_w log N_w)</td>
      <td>多分辨率分析</td>
    </tr>
    <tr>
      <td>CWT_Approx</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">n_scales + 2</td>
      <td style="text-align: center">O(n_scales · N log N)</td>
      <td>自适应时频分析</td>
    </tr>
    <tr>
      <td>STFT_Pool</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">n_freq</td>
      <td style="text-align: center">O(N log N)</td>
      <td>轻量时频</td>
    </tr>
    <tr>
      <td>EnvelopeFFT</td>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">O(N log N)</td>
      <td>轴承故障诊断</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="5-集成实现">5. 集成实现</h2>

<h3 id="51-freq_transformspy-模块">5.1 <code class="language-plaintext highlighter-rouge">freq_transforms.py</code> 模块</h3>

<p>新建独立模块 <code class="language-plaintext highlighter-rouge">code/TFC/freq_transforms.py</code>，包含工厂函数 <code class="language-plaintext highlighter-rouge">get_freq_transform(type, n_samples)</code>，返回 <code class="language-plaintext highlighter-rouge">nn.Module</code> 或 <code class="language-plaintext highlighter-rouge">None</code>（表示回退到原始FFT）。</p>

<h3 id="52-dataloaderpy-修改">5.2 <code class="language-plaintext highlighter-rouge">dataloader.py</code> 修改</h3>

<p>两处 FFT 调用替换为可配置变换：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Load_Dataset.__init__ 中：
</span><span class="n">freq_transform</span> <span class="o">=</span> <span class="n">get_freq_transform</span><span class="p">(</span>
    <span class="nb">getattr</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="s">'freq_transform_type'</span><span class="p">,</span> <span class="s">'fft'</span><span class="p">),</span>
    <span class="n">n_samples</span><span class="o">=</span><span class="n">window_length</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">x_data_f</span> <span class="o">=</span> <span class="p">(</span><span class="n">freq_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">x_data</span><span class="p">)</span> <span class="k">if</span> <span class="n">freq_transform</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span>
                 <span class="k">else</span> <span class="n">fft</span><span class="p">.</span><span class="n">fft</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">x_data</span><span class="p">).</span><span class="nb">abs</span><span class="p">())</span>
</code></pre></div></div>

<h3 id="53-配置文件修改">5.3 配置文件修改</h3>

<p>在所有 <code class="language-plaintext highlighter-rouge">config_files/*_Configs.py</code> 中新增：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="bp">self</span><span class="p">.</span><span class="n">freq_transform_type</span> <span class="o">=</span> <span class="s">'fft'</span>  <span class="c1"># 'multiscale' | 'cwt_approx' | 'stft_pool' | 'envelope'
</span></code></pre></div></div>

<p>默认值 <code class="language-plaintext highlighter-rouge">'fft'</code> 保持向后兼容。</p>

<hr />

<h2 id="6-验证">6. 验证</h2>

<p>在 CPU 环境下对 <code class="language-plaintext highlighter-rouge">[B=4, C=1, T=178]</code> 的随机输入测试全部 4 种变换：</p>

<ul>
  <li>✓ 输入输出形状一致</li>
  <li>✓ 梯度正确回传（<code class="language-plaintext highlighter-rouge">out.sum().backward()</code> 无报错）</li>
  <li>✓ 设备兼容 CPU/CUDA</li>
</ul>

<hr />

<h2 id="7-给轴承故障分类的建议实验路线">7. 给轴承故障分类的建议实验路线</h2>

<ol>
  <li><strong>EnvelopeFFT</strong>（优先）— 包络谱是轴承诊断的金标准，期望直接提升</li>
  <li><strong>CWT_Approx</strong>（次优）— 可学习小波变换，自适应适配故障特征频率</li>
  <li><strong>MultiScaleFFT</strong>（备选）— 多分辨率捕获瞬态冲击+周期成分</li>
</ol>

<p>实验对比设计：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">组</th>
      <th>预训练源</th>
      <th>目标</th>
      <th style="text-align: center">freq_transform</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Baseline</td>
      <td>SleepEEG</td>
      <td>Bearing</td>
      <td style="text-align: center">fft</td>
    </tr>
    <tr>
      <td style="text-align: center">Exp1</td>
      <td>SleepEEG</td>
      <td>Bearing</td>
      <td style="text-align: center">envelope</td>
    </tr>
    <tr>
      <td style="text-align: center">Exp2</td>
      <td>SleepEEG</td>
      <td>Bearing</td>
      <td style="text-align: center">cwt_approx</td>
    </tr>
    <tr>
      <td style="text-align: center">Exp3</td>
      <td>SleepEEG</td>
      <td>Bearing</td>
      <td style="text-align: center">multiscale</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="8-数据集准备规范">8. 数据集准备规范</h2>

<p>为接入 TF-C 训练，轴承数据集需满足：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># train.pt / test.pt 格式
</span><span class="p">{</span>
    <span class="s">'samples'</span><span class="p">:</span> <span class="n">torch</span><span class="p">.</span><span class="n">Tensor</span> <span class="n">of</span> <span class="n">shape</span> <span class="p">[</span><span class="n">N</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">T</span><span class="p">],</span>  <span class="c1"># 或 [N, T]，自动补维
</span>    <span class="s">'labels'</span><span class="p">:</span>  <span class="n">torch</span><span class="p">.</span><span class="n">LongTensor</span> <span class="n">of</span> <span class="n">shape</span> <span class="p">[</span><span class="n">N</span><span class="p">],</span>     <span class="c1"># 0, 1, 2, ...
</span><span class="p">}</span>
<span class="n">torch</span><span class="p">.</span><span class="n">save</span><span class="p">(</span><span class="n">data_dict</span><span class="p">,</span> <span class="s">'train.pt'</span><span class="p">)</span>
</code></pre></div></div>

<p>预处理步骤：</p>
<ol>
  <li>原始长信号切片（窗口长度 T，重叠率可调）</li>
  <li>逐段标注故障类型（正常=0, 内圈=1, 外圈=2, 滚动体=3…）</li>
  <li>train.pt：每类 30 样本（微调）；test.pt：剩余全部</li>
  <li>源预训练集可复用 SleepEEG 或使用大规模轴承运行数据</li>
</ol>

<hr />

<h2 id="参考文献-1">参考文献</h2>

<p>[1] Zhang X, Zhao Z, Tsiligkaridis T, et al. Self-supervised contrastive pre-training for time series via time-frequency consistency. <em>Advances in Neural Information Processing Systems</em>, 2022, 35: 10970–10983.</p>

<p>[2] Muradeli J. ssqueezepy: Synchrosqueezing, wavelet transforms, and time-frequency analysis in Python. GitHub: OverLordGoldDragon/ssqueezepy, v0.6.6.</p>

<p>[3] Randall R B, Antoni J. Rolling element bearing diagnostics — A tutorial. <em>Mechanical Systems and Signal Processing</em>, 2011, 25(2): 485–520.</p>

<hr />

<ul>
  <li>TF-C 源码: https://github.com/mims-harvard/TFC-pretraining</li>
  <li>SSqueezepy: https://github.com/OverLordGoldDragon/ssqueezepy</li>
  <li>本文实现: <code class="language-plaintext highlighter-rouge">d:\WorkZone\AE_WorkZone\TFC-pretraining\code\TFC\freq_transforms.py</code></li>
</ul>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="PaperNote" /><category term="TFC" /><category term="Time-Frequency-Analysis" /><category term="Non-Stationary-Signal" /><category term="Bearing-Fault-Diagnosis" /><category term="Self-Supervised-Learning" /><category term="CWT" /><category term="STFT" /><category term="SSqueezepy" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://liuyirigel.github.io/images/paper_images/05_2d_all_methods_grid.png" /><media:content medium="image" url="https://liuyirigel.github.io/images/paper_images/05_2d_all_methods_grid.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[文献阅读] PAANO:基于补丁的时间序列异常检测表示学习</title><link href="https://liuyirigel.github.io/posts/2026/04/paper-note-5/" rel="alternate" type="text/html" title="[文献阅读] PAANO:基于补丁的时间序列异常检测表示学习" /><published>2026-04-05T00:00:00+00:00</published><updated>2026-04-05T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/04/paper-note-5</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/04/paper-note-5/"><![CDATA[<div align="center">
    <img src="../images/paper_images/2026-05-18 163346.png" style="width: 85%; 
                border-radius: 5px; 
                box-shadow: 0 10px 20px rgba(0,0,0,0.2); 
                border: 1px solid #eee;" />
</div>
<p><br /></p>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="PaperNote" /><category term="Bearing-Damage-Detection" /><category term="Date-Set" /><category term="Methods-review" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://liuyirigel.github.io/images/paper_images/2026-05-18%20163346.png" /><media:content medium="image" url="https://liuyirigel.github.io/images/paper_images/2026-05-18%20163346.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[文献阅读] A benchmark for bearing damage detection: Dataset and methods review</title><link href="https://liuyirigel.github.io/posts/2026/03/paper-note-4/" rel="alternate" type="text/html" title="[文献阅读] A benchmark for bearing damage detection: Dataset and methods review" /><published>2026-04-03T00:00:00+00:00</published><updated>2026-04-03T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/03/Paper-note-4</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/03/paper-note-4/"><![CDATA[<div align="center">
    <img src="../images/paper_images/{96809E6E-2505-49A2-8FE9-D2DA86A8B64C}.png" style="width: 85%; 
                border-radius: 5px; 
                box-shadow: 0 10px 20px rgba(0,0,0,0.2); 
                border: 1px solid #eee;" />
</div>
<p><br /></p>

<p>6203轴承损伤状态：数据驱基准数据集</p>

<ul>
  <li>
    <p><a href="https://groups.uni-paderborn.de/kat/BearingDataCenter/">Uni-paderborn data center</a></p>
  </li>
  <li>
    <p><a href="https://mb.uni-paderborn.de/en/kat/research/bearing-datacenter/data-sets-and-download">Data-Set and download</a></p>
  </li>
  <li>
    <p><a href="https://mb.uni-paderborn.de/fileadmin-mb/kat/PDF/Veroeffentlichungen/20160703_PHME16_CM_bearing.pdf#page=8">Data-Set Document</a></p>
  </li>
</ul>

<h2 id="research-objectives">Research Objective(s)</h2>
<p>uni-paderborn的研究人员提出了一个新的轴承损伤检测数据集，并对现有的轴承损伤检测方法进行了评估和比较。该数据集包含了6203轴承在不同损伤状态下的振动信号，旨在为轴承损伤检测领域提供一个标准化的基准数据集，以促进算法的开发和评估。</p>

<p>其研究人员希望通过Motor Current signal(MCS) 的方法来检测和评估故障轴承信号的分类性能，同时与多种现有的轴承损伤检测方法进行了比较，并设定了一个包含有人工损伤/ 自然损伤/ 健康状态的轴承数据集，设置了严谨的实验台和数据采集流程，评估了不同的轴承损伤检测方法，并提供了一个基准数据集，以促进该领域的研究和发展。</p>

<h2 id="date-set">Date-Set</h2>
<h3 id="轴承损伤的分类">轴承损伤的分类</h3>
<p>uni-paderborn的研究人员不同于ISO 15243 标准对于轴承失效的六大分类（疲劳、磨损、腐蚀、电侵蚀、塑性变形以及断裂和开裂），其分类方式不能很好的描述缺陷的详细信息。因此，研究人员将轴承损伤分为四大信息，前三类提供轴承信息，第四类详细说明损坏情况。根据这些标准，可以为任何受损轴承制作详细参数以及实验设置说明。</p>

<div align="center">
    <img src="../images/paper_images/{8D75CBE3-71CF-4099-B56B-BF9B1FE92F9F}.png" width="60%" alt="img" />
</div>
<p><br /></p>

<h3 id="damage-combinations-损伤组成">Damage combinations/ 损伤组成：</h3>

<ul>
  <li>Single damage: 滚珠轴承上的单一部件的单一损伤，如内圈、外圈、滚珠或保持架的单一损伤。</li>
  <li>Repetitive damage: 同一轴承部件的多个部位重复出现相同的损伤症状，例如内环滚道上的多个非连续点蚀。</li>
  <li>Multiple damage: 轴承的多个部件同时存在不同类型的损伤，例如内圈和外圈同时存在点蚀。</li>
</ul>

<h3 id="arrangement-of-the-repetitive-and-multiple-damages-重复和多重损伤类别">Arrangement of the repetitive and multiple damages/ 重复和多重损伤类别：</h3>
<p>该标准描述了各个部件（如内环）上重复性和多次损伤（见上文）损伤症状的类别。该标准由以下选项描述：</p>

<ul>
  <li>Regular: 损伤症状会在组件上以规律模式反复出现。</li>
  <li>Random: 局部损伤症状的随机分布。</li>
  <li>No repetition: 损伤只发生一次，此标准不适用。</li>
</ul>

<h3 id="geometrical-size-and-extent-of-damage-损伤尺寸描述与评级">Geometrical size and Extent of damage/ 损伤尺寸描述与评级</h3>

<p>损伤的几何大小由损伤的长度、宽度和深度描述，根据VDI 3832 (2013)
Geometrical size：</p>

<div align="center">
    <img src="../images/paper_images/{C7410D63-534A-4EFC-B6C9-CB85A27D85FD}.png" width="60%" alt="img" />
</div>
<p><br /></p>

<p>Extent of damage：
损伤程度描述了损伤的归一化水平大小，这些水平与轴承尺寸无关，其等级基于损坏的长度，因为从机器操作员的角度来看，这是决定信号输出（CM）和损伤强度的决定因素。为此，计算长度与轴承周长的百分比，然后根据表2分为五个级别。</p>

<div align="center">
    <img src="../images/paper_images/{0AB0CA51-5982-44A2-9A7A-8AC0137A79B0}.png" width="70%" alt="img" />
</div>
<p><br /></p>

<h3 id="artificial-damage-人工损伤">Artificial damage/ 人工损伤</h3>
<p>本文中使用的人工损害由三种不同方法引起：</p>

<ul>
  <li>
    <p>electric discharge machining: 电放电加工 (trench of 0.25 mm length in rolling direction and depth of 1-2 mm)</p>
  </li>
  <li>
    <p>drilling 钻孔 (diameter: 0.9 mm, 2 mm, 3 mm)</p>
  </li>
  <li>
    <p>manual electric engraving 手工电刻 (damage length from 1-4 mm)，这种损伤表面结构不规则且深度较浅，因此类似于真实的点蚀损伤。</p>
  </li>
</ul>

<p>关于根据制定标准（见第2节）可用测试轴承的尺寸及分类细节，详见Table 4</p>

<div align="center">
    <img src="../images/paper_images/{5581B243-6FB5-4F9E-B7AC-73831B8101F5}.png" width="50%" alt="img" />
</div>
<p><br /></p>

<p>实验中，所有人工伤害都是单点伤害，没有重复性伤害，也没有与其他伤害组合（参见第2节——轴承损伤的分类）</p>

<h3 id="generating-real-bearing-damage-samples-by-accelerated-lifetime-tests-通过加速寿命测试生成真实轴承损伤样本">Generating Real Bearing Damage Samples by Accelerated Lifetime Tests/ 通过加速寿命测试生成真实轴承损伤样本</h3>
<p>本研究中，真实损伤的滚珠轴承通过加速寿命测试获得。加速寿命测试装置由轴承壳体和电动机组成，电动机驱动壳体内配备四个6203型测试轴承的轴（见图2）。测试轴承在径向载荷下旋转，该载荷由弹簧螺丝机构施加。</p>

<p>施加的径向力比通常轴承应用中更高，以加速疲劳损伤的出现，但仍足够低，并不超出轴承的静态载荷承受能力。此外，使用了低粘度机油，导致润滑条件不匹配，且更容易出现损坏。</p>

<div align="center">
    <img src="../images/paper_images/{1CB3F1AC-1062-4900-BF8C-CA905496EBDD}.png" width="60%" alt="img" />
</div>
<p><br /></p>

<p>通过寿命测试，获得了若干受损轴承，并根据制定的标准进行了分类。在使用周期测试中使用的108个轴承中，18个轴承被认定了33处损坏。约70%的损坏是疲劳损伤，表现为点蚀。</p>

<p>除一处断裂外，其余轴承均因塑性变形而受损，即由碎屑造成的凹陷。轴承的内环和外环都发生了点蚀损伤。仅在外环发现了凹陷。未观察到滚动部件的损坏。损坏程度根据受损表面滚向1至3级的长度分类（参见Table 2和Table 5）</p>

<div align="center">
    <img src="../images/paper_images/{0BBACA70-8B4E-4E53-A49A-FA9AE2C45252}.png" width="60%" alt="img" />
</div>
<p><br /></p>

<h2 id="experimental-set-up-实验设置">Experimental set-up/ 实验设置</h2>
<p>通过实验重现以利用测试设备生成故障数据。在生成测量数据时，会记录电机的电流信号。此外，测试轴承壳体的振动信号也被测量为参考。</p>

<h3 id="test-rig-测试平台">Test-rig/ 测试平台</h3>
<p>测试平台由多个模块组成：</p>

<p>电动机（1）、扭矩测量轴（2）、滚轴承测试模块（3）、飞轮（4）和负载电机（5），详见图4。不同损伤类型的滚珠安装在轴承测试模块中以生成实验数据</p>

<div align="center">
    <img src="../images/paper_images/{1B747E1D-F777-49F6-91BA-185B0132C68D}.png" width="70%" alt="img" />
</div>
<p><br /></p>

<p>电机（1）是一台425瓦永磁同步电机（PMSM），额定扭矩为T = 1.35牛米，额定转速为n = 3,000转/分钟，额定电流为I = 2.3 A，极对编号p=4（Type SD4CDu8S009, Hanning Elektro-Werke GmbH &amp; Co. KG）。它由频率逆变器（KEB Combivert 07F5E 1D-2B0A）操作，切换频率为16 kHz。</p>

<p>轴承壳体的加速度通过滚动轴承模块顶部的适配器测量，使用压电加速度计（Model No. 336C04, PCB Piezotronics, Inc.）和一个带低通滤波器的电荷放大器（Type 5015A, Kistler Group）在30 kHz进行测量。信号被数字化并同步存储到MCS，采样率为64 kHz。</p>

<p>飞轮和载荷机分别模拟被动设备的惯性和负载。负载电机为PMSM，额定扭矩为6牛米（功率1.7千瓦）。</p>

<h2 id="experiment-实验">Experiment/ 实验</h2>

<p>驱动系统的转速、对测试轴承的径向力以及传动系统中的负载扭矩是主要的操作参数。为确保实验可比性，每个参数都设定了固定水平（见表6）。这三个参数在每次测量时间内保持不变。</p>

<p>在操作参数的基本设置（0号组）下，测试装置以 n = 1,500 rpm 运行，负载扭矩为 M = 0.7 Nm，方位的径向力为 F = 1,000 N。通过将参数逐一降低至n=900转/分钟、M=0.1牛顿和F=400牛顿（编号1-3）来使用三种额外设置。每个设置记录了20次4秒的测量。另一个参数是温度，所有实验期间温度大致保持在45-50°C之间。</p>

<p>总共进行了32种不同轴承的实验：12个轴承受人为损伤，14个轴承因加速寿命测试受损（见表4和表5）。此外，还进行了6个健康轴承和不同操作时间的实验作为参考状态，如表7所示。</p>

<div align="center">
    <img src="../images/paper_images/{3032ED56-1A01-4560-998A-C583AE648A87}.png" width="70%" alt="img" />
</div>
<p><br /></p>

<h2 id="database-公开数据库">DataBase/ 公开数据库</h2>

<ul>
  <li>CWRU: Bearing Data Center/ Seeded Fault Test Data</li>
  <li>FEMTO Bearing Data Set</li>
  <li>MFPT Fault Data Sets</li>
  <li>Bearing Data Set IMS</li>
</ul>

<p>有些使用人工伤害（CWRU、MFPT），另一些使用真实伤害（FEMTO、IMS）
CWRU和FEMTO通过不同负载和速度使用不同的工作条件;</p>

<p>另一些则仅使用不同的载荷情况（MFPT）或仅使用单一条件（IMS）。FEMTO数据集提供了运行至失效的数据，并提供了长周期的测量数据，但不提供损坏性质的任何信息。</p>

<p>Link:</p>

<ul>
  <li>
    <p><a href="http://csegroups.case.edu/bearingdatacenter/home">CWRU: Bearing Data Center/ Seeded Fault Test Data</a></p>
  </li>
  <li>
    <p><a href="http://www.femtost.fr/en/Research-departments/AS2M/Research-groups/PHM/IEEE-PHM2012-Data-challenge.php">FEMTO Bearing Data Set</a></p>
  </li>
  <li>
    <p><a href="http://www.mfpt.org/FaultData/FaultData.htm">MFPT Fault Data Sets</a></p>
  </li>
  <li>
    <p><a href="http://ti.arc.nasa.gov/tech/dash/pcoe/prognostic-data-repository/">Bearing Data Set IMS</a></p>
  </li>
</ul>

<p>本研究的实验数据包括：</p>

<p>32个不同轴承实验的测量数据。轴承主要分为三大类：</p>

<ul>
  <li>
    <p>Undamaged (healthy) bearings (6x), see Table 6.</p>
  </li>
  <li>
    <p>Artificially damaged bearings (12x), see Table 4.</p>
  </li>
  <li>
    <p>Bearings with real damages caused by accelerated lifetime tests, (14x) see Table 5.</p>
  </li>
</ul>

<h2 id="envelope-analysis-for-vibration-signals-震动信号包络分析">Envelope analysis for vibration signals/ 震动信号包络分析</h2>

<p>轴承损伤导致信号中典型的特征运动学频率。当已知损伤位置（如外环或内环）及轴承几何参数时，这些频率可以用于局部损伤。</p>

<p>以两处单点损伤为例，分别位于内圈（KA04）和外圈（KI18）。图6中的包络谱清晰显示了外圈道 $f_0$ 的球通频率及其谐波。图7中内圈的损伤包络谱显示了轴及其谐波的基本旋转频率$f_n$、内圈的球通频率 $f_i$ 及其边带和相应的谐波。</p>

<div align="center">
    <img src="../images/paper_images/{96495C42-19F7-4E9F-98D4-287D6C9BF144}.png" width="70%" alt="img" />
</div>
<p><br /></p>

<p>从图8中，只有电源频率 $f_e$ 及其谐波容易被观察到。这主要是由于携带特征频率被外部噪声掩蔽，以及分布式损伤难以用特征频率方法检测</p>

<p>但采用DL（Deep Learning）的一些方法时，仍然可以从信号中提取有用的特征来区分不同的损伤状态，即使在传统方法无法检测到特征频率的情况下。</p>

<div align="center">
    <img src="../images/paper_images/{CCC0BBE4-1114-4BFA-9596-365B431A8426}.png" width="100%" alt="img" />
</div>

<h2 id="referencesoptional">References(optional)</h2>

<ul>
  <li>
    <p><a href="http://csegroups.case.edu/bearingdatacenter/home">CWRU: Bearing Data Center/ Seeded Fault Test Data</a></p>
  </li>
  <li>
    <p><a href="http://www.femtost.fr/en/Research-departments/AS2M/Research-groups/PHM/IEEE-PHM2012-Data-challenge.php">FEMTO Bearing Data Set</a></p>
  </li>
  <li>
    <p><a href="http://www.mfpt.org/FaultData/FaultData.htm">MFPT Fault Data Sets</a></p>
  </li>
  <li>
    <p><a href="http://ti.arc.nasa.gov/tech/dash/pcoe/prognostic-data-repository/">Bearing Data Set IMS</a></p>
  </li>
  <li>
    <p><a href="https://groups.uni-paderborn.de/kat/BearingDataCenter/">Uni-paderborn data center</a></p>
  </li>
  <li>
    <p><a href="https://mb.uni-paderborn.de/en/kat/research/bearing-datacenter/data-sets-and-download">Data-Set and download</a></p>
  </li>
  <li>
    <p><a href="https://mb.uni-paderborn.de/fileadmin-mb/kat/PDF/Veroeffentlichungen/20160703_PHME16_CM_bearing.pdf#page=8">Data-Set Document</a></p>
  </li>
</ul>

<div style="height: 2px; background: linear-gradient(to right, rgba(0,0,0,0), rgba(138, 43, 201, 0.45), rgba(0,0,0,0)); margin: 20px 0; clear: both;"></div>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="PaperNote" /><category term="Bearing-Damage-Detection" /><category term="Date-Set" /><category term="Methods-review" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://liuyirigel.github.io/images/paper_images/%7B96809E6E-2505-49A2-8FE9-D2DA86A8B64C%7D.png" /><media:content medium="image" url="https://liuyirigel.github.io/images/paper_images/%7B96809E6E-2505-49A2-8FE9-D2DA86A8B64C%7D.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[参考] 注热开采天然气水合物 COMSOL 模型（含控制方程与推导）</title><link href="https://liuyirigel.github.io/posts/2026/03/dxh-test/" rel="alternate" type="text/html" title="[参考] 注热开采天然气水合物 COMSOL 模型（含控制方程与推导）" /><published>2026-03-28T00:00:00+00:00</published><updated>2026-03-28T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/03/dxh-test</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/03/dxh-test/"><![CDATA[<p>二维注热开采天然气水合物模型控制方程</p>

<h2 id="-1-模型假设">📌 1. 模型假设</h2>

<p>为保证模型可解与稳定，采用如下简化：</p>

<ul>
  <li>单相等效流体（忽略气/水速度差异）</li>
  <li>各相局部热平衡（LTE）</li>
  <li>多孔介质各向同性</li>
  <li>水合物分解为动力学控制</li>
  <li>忽略毛细压力与重力</li>
</ul>

<hr />

<h1 id="-2-控制方程">🧩 2. 控制方程</h1>

<hr />

<h2 id="21-质量守恒darcy-流">2.1 质量守恒（Darcy 流）</h2>

<h3 id="连续性方程">连续性方程</h3>
<p>```math id=”eq_mass”
\frac{\partial (\phi \rho)}{\partial t} + \nabla \cdot (\rho \mathbf{u}) = m_g</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---

### Darcy 定律
```math id="eq_darcy"
\mathbf{u} = -\frac{k}{\mu} \nabla p
</code></pre></div></div>
<hr />

<h3 id="渗透率演化">渗透率演化</h3>
<p>```math id=”eq_perm”
k = k_0 \left( \frac{\phi}{\phi_0} \right)^3</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---

## 2.2 能量守恒（多孔介质）

```math id="eq_energy"
(\rho C_p)_{eff} \frac{\partial T}{\partial t}
+ \rho C_p \mathbf{u} \cdot \nabla T
= \nabla \cdot (k_{eff} \nabla T) + Q_h
</code></pre></div></div>
<hr />

<h3 id="等效体积热容">等效体积热容</h3>

<p>```math id=”eq_ceq”
(\rho C_p)_{eff} = (1-\phi)\rho_s C_s + \phi \rho_f C_f</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---

### 等效导热系数

```math id="eq_keq"
k_{eff} = (1-\phi)\lambda_s + \phi \lambda_f
</code></pre></div></div>
<hr />

<h2 id="23-水合物分解动力学">2.3 水合物分解动力学</h2>

<p>```math id=”eq_kinetic”
\frac{dS_h}{dt} = -k_{react} \cdot \max\left( \frac{p - p_{eq}}{p_{eq}}, 0 \right) S_h</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---

## 2.4 分解热源项
```math id="eq_Qh"
Q_h = \rho_h \cdot k_{react} \cdot \max\left( \frac{p - p_{eq}}{p_{eq}}, 0 \right) S_h \cdot \Delta H
</code></pre></div></div>
<hr />

<h1 id="-3-方程推导要点">🔍 3. 方程推导要点</h1>
<hr />
<h2 id="31-能量方程推导">3.1 能量方程推导</h2>
<p>从多相体系能量守恒：
```math id=”eq_energy_origin”
\sum_i \frac{\partial (\phi \rho_i S_i C_i T)}{\partial t}</p>
<ul>
  <li>\sum_i \nabla \cdot (\rho_i C_i \mathbf{u}<em>i T)
= \nabla \cdot (k</em>{eff} \nabla T) + Q_h
```
—</li>
</ul>

<p>在假设：</p>

<ul>
  <li>单相等效流速：(\mathbf{u}_i \approx \mathbf{u})</li>
  <li>局部热平衡</li>
</ul>

<p>可化简为：</p>

<p>```math id=”eq_energy_simplified”
(\rho C_p)_{eff} \frac{\partial T}{\partial t}</p>
<ul>
  <li>\rho C_p \mathbf{u} \cdot \nabla T
= \nabla \cdot (k_{eff} \nabla T) + Q_h
```
—</li>
</ul>

<h2 id="32-热源项来源">3.2 热源项来源</h2>

<p>水合物分解：</p>

<p>```math id=”eq_reaction”
Hydrate \rightarrow Gas + Water</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
单位体积反应速率：

```math id="eq_rate"
r = \rho_h \cdot \frac{dS_h}{dt}
</code></pre></div></div>

<p>乘以反应焓：</p>

<p>```math id=”eq_Qh_derivation”
Q_h = r \cdot \Delta H</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---

# ⚙️ 4. COMSOL 对应关系

| 物理方程     | COMSOL接口                      |
| -------- | ----------------------------- |
| Darcy 定律 | Darcy's Law                   |
| 能量方程     | Heat Transfer in Porous Media |
| 分解动力学    | Domain ODE                    |
| 热源项      | Heat Source                   |

---

### 关键耦合

```comsol
Velocity field = [dl.u, dl.v]
Q = Qh
</code></pre></div></div>

<hr />

<h1 id="-5-初始与边界条件">📊 5. 初始与边界条件</h1>

<h2 id="初始条件">初始条件</h2>

<p>```math id=”eq_init”
T = T_0,\quad p = p_0,\quad S_h = S_{h0}</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
---

## 边界条件

### 注热边界

```math id="eq_bc_T"
T = T_{inj}
</code></pre></div></div>

<hr />

<h3 id="生产井">生产井</h3>

<p>```math id=”eq_bc_p”
p = p_{out}</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
---

### 其余边界

```math id="eq_bc_other"
\mathbf{n}\cdot \nabla T = 0,\quad \mathbf{n}\cdot \mathbf{u} = 0
</code></pre></div></div>

<hr />

<h1 id="-6-模型扩展方向">🚀 6. 模型扩展方向</h1>

<hr />

<h2 id="61-双相流模型">6.1 双相流模型</h2>

<p>```math id=”eq_two_phase”
\mathbf{u}_g \neq \mathbf{u}_w</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
---

## 6.2 孔隙率演化

```math id="eq_phi"
\phi = \phi_0 + \alpha (S_{h0} - S_h)
</code></pre></div></div>

<hr />

<h2 id="63-thm耦合">6.3 THM耦合</h2>

<ul>
  <li>热（T）</li>
  <li>渗流（p）</li>
  <li>力学（σ）</li>
  <li>分解（Sh）</li>
</ul>

<hr />

<h1 id="-7-总结">✅ 7. 总结</h1>

<p>该模型构建了一个<strong>注热驱动水合物分解的最小物理闭环</strong>：</p>

<p><code class="language-plaintext highlighter-rouge">text id="eq_flow"
注热 → 升温 → 分解 → 孔隙变化 → 渗流 → 继续传热
</code></p>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="COMSOL" /><category term="水合物" /><summary type="html"><![CDATA[二维注热开采天然气水合物模型控制方程]]></summary></entry><entry><title type="html">Paper Note Tempalet</title><link href="https://liuyirigel.github.io/posts/2026/03/paper-note-1/" rel="alternate" type="text/html" title="Paper Note Tempalet" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/03/Paper-note-1</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/03/paper-note-1/"><![CDATA[<p>一篇论文笔记模板，Mark一下</p>

<h2 id="summary">Summary</h2>
<p>写完笔记之后最后填，概述文章的内容，以后查阅笔记的时候先看这一段。注：写文章summary切记需要通过自己的思考，用自己的语言描述。忌讳直接Ctrl + c原文。</p>

<h2 id="research-objectives">Research Objective(s)</h2>
<p>作者的研究目标是什么？</p>

<h2 id="background--problem-statement">Background / Problem Statement</h2>
<p>研究的背景以及问题陈述：作者需要解决的问题是什么？</p>

<h2 id="methods">Method(s)</h2>
<p>作者解决问题的方法/算法是什么？是否基于前人的方法？基于了哪些？</p>

<h2 id="evaluation">Evaluation</h2>
<p>作者如何评估自己的方法？实验的setup是什么样的？感兴趣实验数据和结果有哪些？有没有问题或者可以借鉴的地方？</p>

<h2 id="conclusion">Conclusion</h2>
<p>作者给出了哪些结论？哪些是strong conclusions, 哪些又是weak的conclusions（即作者并没有通过实验提供evidence，只在discussion中提到；或实验的数据并没有给出充分的evidence）?</p>

<h2 id="notesoptional">Notes(optional)</h2>
<p>不在以上列表中，但需要特别记录的笔记。</p>

<h2 id="referencesoptional">References(optional)</h2>
<p>列出相关性高的文献，以便之后可以继续track下去。</p>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="PaperNote" /><category term="Tempalet" /><summary type="html"><![CDATA[一篇论文笔记模板，Mark一下]]></summary></entry><entry><title type="html">[Essay] Choose Life</title><link href="https://liuyirigel.github.io/posts/2026/03/blog-3-en/" rel="alternate" type="text/html" title="[Essay] Choose Life" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/03/blog-3-en</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/03/blog-3-en/"><![CDATA[<p>Just jotting down some random thoughts here~</p>

<h2 id="20260325">2026/03/25</h2>
<p>I went to see <em>Rescue Mission</em> the day before yesterday. I’d been hearing bits and pieces about this movie since late last year, and since it’s a space sci-fi film, I thought it sounded pretty interesting.
——
I haven’t seen many of Ridley Scott’s films; the only one that stands out to me is <em>Blade Runner 2049</em>. I really love the color palette in that movie.</p>

<div align="center">
    <img src="/images/taxe-driver.png" width="90%" alt="Taxi Driver" />
</div>

<hr />

<p>Then there’s <em>Taxi Driver</em>; I actually find myself drawn to this kind of film—that subtle, cool detachment and pain.</p>

<p>When I watch movies, I always think back to photos I’ve taken before. During the Spring Festival, while the air quality was good back home, I borrowed a friend’s camera and tried my hand at photographing the Orion Nebula.</p>

<div align="center">
    <img src="/images/3.1.1.png" width="90%" alt="Orion Nebula" />
</div>

<hr />
<p>It’s truly beautiful.</p>

<p>I’m so grateful to still be able to see such mysterious and beautiful celestial bodies.</p>

<h2 id="20260327">2026/03/27</h2>
<p>I’ve spent some time over the past couple of days re-evaluating my research direction.</p>

<p>In the past, when dealing with time series data, I always thought about converting it into image signals and then processing it with visual models—I’d fallen into a vicious cycle of empiricism. I’d simply follow what others had done before and try to go in that direction myself.</p>

<p>Looking back, I realize that doing research today is truly difficult. I don’t even feel like I’m doing research anymore. When reading papers, I look down on simple ones, yet I can’t replicate the efficient and useful ones myself. Most of the time, I’m in a state of being all talk and no action, with my abilities falling short. After discovering a method, I’ve tried it out, but the results are poor, and the interpretability is terrible—it feels like a monstrosity cobbled together.</p>

<p>In time-series processing—especially time-frequency analysis for acoustic emission and industrial fault diagnosis—it’s incredibly difficult to achieve true innovation. The mathematical models developed by previous researchers took years to create, and they’re still in use today. Since fundamental innovation is out of reach, we’re limited to methodological innovations: A+B, B+C. Under the broad umbrella of AI, everyone is going all-in; once a method emerges, specialized vertical fields quickly develop their own engineering implementations.</p>

<p>Over the past couple of days, I’ve returned to processing raw signals. I’ve looked up some relevant time-series models to try reproducing them, hoping to at least improve the interpretability of the models. Since my skills are limited, I’ll just have to experiment more—hopefully, there’s enough time.</p>

<p>Today, I processed some photos from the Chinese New Year holiday.</p>
<div align="center">
    <img src="/images/blog_images/微信图片_20260327201453.png" width="90%" alt="flwer" />
</div>

<hr />
<p>The magnolias next to my house bloomed early this spring—they were already in bloom before I even returned to Shenzhen. While sitting on a small stool soaking up the sun this afternoon, I could still catch whiffs of their fragrance.</p>

<h2 id="20260329255">2026/03/29/2:55</h2>
<p>I feel a cold, unfamiliar, nauseating, and bitter sensation spreading upward from my toes</p>

<h2 id="20260329">2026/03/29</h2>
<p>I’ve bought a lot of whiskey lately and tried various flavors. I first tried whiskey during the Lunar New Year. I arrived at my relatives’ house a little over a week before my parents did.
When I go home for the New Year, reality always pulls me back from my rationality every now and then, dragging me from my idealistic fantasies back to reality. I hate the constant chatter and noise of children, but during that week, I also saw their cuteness and charm—that simple, innocent joy and happiness. In 2026, I turned 21 and am now approaching 22. Time has passed so quickly that I’ve grown up before I even had a chance to fully savor the joy and innocence of childhood. Looking back on the past 22 years, there have been so few moments of genuine happiness for myself—I can barely recall a single one. Instead, it’s the bad memories that keep ringing in my ears. I’ve often heard that people selectively forget things that have deeply hurt them, but I simply can’t agree with that. Either I’m a masochist, or that saying is wrong. Growing up has been so painful. When I went home for the New Year this year, I found that the environment back home had changed a lot. Whether in Shenzhen or Hubei, there’s no trace left of my childhood. That small lake behind my hometown, which used to seem so vast and boundless to me as a child, now looks like nothing more than a small pond. Life is truly hard, but being alive is really quite good—I can still look at myself, look at my child, and look at everything around me.</p>

<p>I’m so tired. I’ll stop writing here for today. Let’s look at some photos instead.</p>

<div align="center">
    <img src="/images/blog_images/微信图片_20260329182017.jpg" width="90%" alt="img" />
</div>

<hr />
<div align="center">
    <img src="/images/blog_images/微信图片_20260329182021.jpg" width="90%" alt="img" />
</div>

<hr />
<div align="center">
    <img src="/images/blog_images/DSC_2721.png" width="90%" alt="img" />
</div>

<hr />
<p>Here’s hoping I make it to next year.</p>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="english" /><category term="blog" /><summary type="html"><![CDATA[Just jotting down some random thoughts here~]]></summary></entry><entry><title type="html">[随笔] Choose Life</title><link href="https://liuyirigel.github.io/posts/2026/03/blog-3/" rel="alternate" type="text/html" title="[随笔] Choose Life" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/03/blog-3</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/03/blog-3/"><![CDATA[<p>If you need englis, click here
<a href="/posts/2026/03/blog-3-en/">English Version</a></p>

<p>在这里写些不着边际的话</p>

<h2 id="2026325">2026/3/25</h2>
<p>前天去看了《挽救行动》，去年年底的时候就有慢慢有听到这部电影的相关消息，看到是太空科幻题材的电影，还挺有意思的。
——
高司令出演的电影我看的不多，有印象的也就是一部《银翼杀手2049》，很喜欢这部电影的色彩表现</p>

<div align="center">
    <img src="/images/taxe-driver.png" width="90%" alt="出租车司机" />
</div>

<hr />

<p>还有《出租车司机》；我倒是挺适合这种电影的，一种丝丝凉意的平淡和痛苦。</p>

<p>看电影的时候总是会想到之前拍的照片，春节的时候趁着在老家空气质量好，用朋友借来的相机试着拍了拍猎户座星云。</p>

<div align="center">
    <img src="/images/3.1.1.png" width="90%" alt="猎户座星云" />
</div>

<hr />
<p>真美啊</p>

<p>真庆幸还能看到这样的神秘美丽的天体。</p>

<h2 id="2026327">2026/3/27</h2>
<p>这两天花了些时间重新看了看自己的研究方向</p>

<p>之前对时间序列的处理总是想着转成图像信号之后再用视觉模型做处理，陷入经验主义的怪圈了。之前的人怎么做，那我也想着往这个方向试试。</p>

<p>回过头来想想现在科研真的很难，自己也不太觉得是在做科研，看文献的时候，简单的文章看不上，高效有用的文章自己有做不到。眼高手低，能力不足反而是大多数时间的状态。发现了一个方法之后，做了些尝试，但效果不佳，可解释性也很差，像是缝合出来的怪东西。</p>

<p>时序处理，特别是做声发射/ 工业故障方向的时频分析完全的做创新很难。前人做的数学建模用了多少年，到现在也还在用，基础创新做不到，就只能做些方法创新，A+B，B+C，AI大方向下，大家都在All in，一个方法出来了，细分的垂直领域迅速就会涌现出自己的工程实现。</p>

<p>这两天回归到原始信号的处理，找了些相关的时序模型复现试试，至少在模型的可解释性上做些提升吧。能力不足，就多些尝试吧，但愿时间足够。</p>

<p>今天把之前过年期间的照片处理了一点。</p>

<div align="center">
    <img src="/images/blog_images/微信图片_20260327201453.png" width="90%" alt="flwer" />
</div>

<hr />
<p>家旁边的玉兰花，今年开春的早，甚至还没回深圳花就开了。下午坐着小板凳晒太阳的时候，还能闻到阵阵花香。</p>

<h2 id="20260329255">2026/03/29/2：55</h2>
<p>我感觉到一种冰冷，陌生，恶心酸苦的触感，在从我的脚趾头向上蔓延</p>

<h2 id="20260329">2026/03/29</h2>
<p>最近买了很多威士忌，试了试各种味道，最开始尝试威士忌还是在过年的时候。我比起我爸妈早个一个多星期，借住在亲戚家里。
过年回家的时候现实总会时不时的把自己从理性中拽回来，把我从理想的幻想中拉回现实。我讨厌小孩叽叽喳喳的聒噪和吵闹，但是在那一个星期中，我也看到了他们的可爱，有趣，那种简单单纯的开心和快乐。2026年，我满21岁，进22岁，时间实在过的太快，以至于我还没来得及仔细感受小时候的快乐和单纯就长大了。回首22年的时光，真正的为自己的快乐实在太少，甚至只能想得起一件事情，倒是一些不好的记忆总萦绕耳边。之前总听说人会选择性的忘记对自己有很大伤害的事情，我实在不能认可这段话，要么我是个M，要么是这句话说错了。成长实在太过痛苦，今年过年回家，家里的环境也变了很多，深圳也好，湖北也好，都没了小时候的痕迹。老家背后的那个小时候看着很大很大，无比广阔的小湖，现在看来也不过是个小池塘。生活实在太苦，但活着真的挺好的，我还能看看自己，看看小孩，看看身边的一切。</p>

<p>好累啊，今天就写到这里，放点照片看看吧</p>

<div align="center">
    <img src="/images/blog_images/微信图片_20260329182017.jpg" width="90%" alt="img" />
</div>

<hr />
<div align="center">
    <img src="/images/blog_images/微信图片_20260329182021.jpg" width="90%" alt="img" />
</div>

<hr />
<div align="center">
    <img src="/images/blog_images/DSC_2721.png" width="90%" alt="img" />
</div>

<hr />
<p>祝愿自己活到明年。</p>

<h2 id="20260415">2026/04/15</h2>
<p>有段时间没有写博客了，今天回过头来写写。最近完成了Dummy的3D打印，和几个主要的机械器件，算是个大工程，希望能早点完成。19号要开组会了，又要忙的爆炸了，感觉时间不够用啊。最近买了本书《身体从未忘记》，有关心理创伤治疗的，倒不是想治好自己，只是说看看自己身上到底发生了什么事情，也算是一种好奇吧，或许之后会开个【阅读笔记】的专栏，记录一下读书的感受和想法吧。感觉自己最近的状态不太好，睡不好，没什么味觉，心情也不好，但是也就接受了，就这样吧活着就好。</p>

<h2 id="20260502">2026/05/02</h2>
<p>状态好了很多，不知道是看开了还是睡好了。</p>

<p>就睡眠这件事情来说，对心情的和状态的影响很大。放假的前两天睡好了点，整个人都好起来了。不过怎么说，希望以后都能睡好点吧，睡不好真的很痛苦。</p>

<h2 id="20260606">2026/06/06</h2>
<p>小组作业就是世界上最傻逼的事情，对能力培养没有任何作用。永远是组内的一两个人干活，其他人当摆设，啥也不干，最后还要一起交作业，成绩还一样。感觉自己被迫和一些不负责任的人绑在一起了，真是太过分了。只能以自己那点可怜的道德心绑架一下自己，完成事情。</p>

<p>已经是一个2开头的成年人了，怎么会一点责任心和担当都没有呢？令人作呕！</p>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="chinese" /><category term="blog" /><summary type="html"><![CDATA[If you need englis, click here English Version]]></summary></entry><entry><title type="html">[文献阅读] TF-C: 基于时频一致性的时间序列自监督对比预训练方法</title><link href="https://liuyirigel.github.io/posts/2026/03/paper-note-2/" rel="alternate" type="text/html" title="[文献阅读] TF-C: 基于时频一致性的时间序列自监督对比预训练方法" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/03/paper-note-2</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/03/paper-note-2/"><![CDATA[<p>通过时间编码和频域编码的自监督算法，一个基于时频一致性的双编码器SimCLR 训练框架</p>

<h2 id="摘要">摘要</h2>

<p>对时间序列进行预训练是一项独特的挑战，因为预训练和目标域之间可能存在不匹配，例如时间动态的偏移、快速演变趋势以及长周期和短周期效应，这些都可能导致下游性能不佳。虽然领域自适应方法可以缓解这些变化，但大多数方法都需要直接从目标领域中获取示例，这就使它们成为预训练的次优方法。</p>

<p>为了应对这一挑战，方法需要适应具有不同时间动态的目标域，并且能够在预训练时不看到任何目标示例。相对于其他模态，我们认为在时间序列中，同一示例的基于时间的表示和基于频率的表示在时频空间中位于接近的位置。为此，我们假设时间-频率一致性（TF-C）——将示例的基于时间的邻域嵌入到其基于频率的邻域附近——对于预训练是可取的。</p>

<p>受 TF-C 的启发，我们定义了一个可分解的预训练模型，其中自监督信号由时间和频率分量之间的距离提供，每个分量都通过对比估计进行了单独训练。我们在八个数据集上对新方法进行了评估，包括电子诊断测试、人类活动识别、机械故障检测和物理状态监测。</p>

<p>与八种最先进方法的对比实验表明，TF-C 在一对一设置（例如在肌电图数据上微调脑电图预训练模型）中平均比基准方法高出 15.4%（F1 分数），在具有挑战性的一对多设置（例如微调脑电图预训练模型用于手势识别或机械故障预测）中平均比基准方法高出 8.4%（精确度），反映了实际应用中出现的各种情况。</p>

<p>源代码和数据集：https://github.com/mims-harvard/TFC-pretraining</p>

<div align="center">
    <img src="/images/paper_images/{27F04C59-16B6-4287-9CD2-D286323D18F7}.png" width="95%" alt="image" />
</div>

<h2 id="时频一致性">时频一致性</h2>
<p>NLP和CV领域都有了他们的表示方法，但对于时频分析来说，却总是缺少一个高效，有用的方法。</p>

<p>对于模型来说，对特征的表达是最根本的问题。
在这样的一个长时间序列中，时域信号和频域信号是不变的，时域和频域成为了表示这个时间序列的两个方向，而时域和频域之间又可以通过傅里叶变换或逆傅里叶变换进行相互的转换；那么在一个有相当容量的时间序列中，作者通过两个方向的编码器，对同一个片段的表达是存在一些联系的。</p>

<hr />

<h2 id="时间编码器-time-encoder">时间编码器 Time Encoder</h2>
<h3 id="encoder">Encoder</h3>
<p>TF-C 的表征提取使用的是ResNet</p>

<p>给定一个时间序列：
\(x \in \mathbb{R}^{L}\)
对这个序列进行增广，包括（jittler\ scaling\ shift）</p>

\[\tilde{x} = \mathcal{A}_T(x)\]

<p>通过对时域编码器进行表征提取</p>

\[h_T = G_T(x), \quad \tilde{h}_T = G_T(\tilde{x})\]

\[G_T: \mathbb{R}^{L} \rightarrow \mathbb{R}^{d}\]

<p>投影空间来分离“表征空间”和“对比空间”</p>

\[z_T = R_T(h_T), \quad \tilde{z}_T = R_T(\tilde{h}_T)\]

<p>时域损失函数使用使用 InfoNCE / 对比损失</p>

\[\mathcal{L}_T = -\log \frac{\exp(\text{sim}(z_T, \tilde{z}_T)/\tau)}{\sum_{j} \exp(\text{sim}(z_T, z_T^j)/\tau)}\]

<h2 id="频域编码器">频域编码器</h2>
<p>频域编码器
傅里叶变换</p>

\[x_F = \mathcal{F}(x)\]

<p>频域增广</p>

\[\tilde{x}_F = \mathcal{A}_F(x_F)\]

<p>表征提取</p>

\[h_F = G_F(x_F), \quad \tilde{h}_F = G_F(\tilde{x}_F)\]

\[G_F: \mathbb{R}^{L} \rightarrow \mathbb{R}^{d}\]

<p>投影空间</p>

\[z_F = R_F(h_F), \quad \tilde{z}_F = R_F(\tilde{h}_F)\]

<p>频域的对比损失</p>

\[\mathcal{L}_F = -\log \frac{\exp(\text{sim}(z_F, \tilde{z}_F)/\tau)}{\sum_{j} \exp(\text{sim}(z_F, z_F^j)/\tau)}\]

<h2 id="时频域对齐一致性">时频域对齐一致性</h2>
<p>跨域表征</p>

\[z_T = R_T(G_T(x))\]

\[z_F = R_F(G_F(x_F))\]

<p>相似度计算</p>

\[\text{sim}(z_T, z_F) = \frac{z_T \cdot z_F}{\|z_T\| \|z_F\|}\]

<p>一致性约束/排序关系</p>

\[\text{sim}(z_T, z_F) &gt; \text{sim}(z_T, \tilde{z}_F)\]

<h3 id="tf-c-损失函数">TF-C 损失函数</h3>

\[\mathcal{L} = \mathcal{L}_T + \mathcal{L}_F + \lambda \mathcal{L}_{TF}\]

<hr />
<ul>
  <li>SimCLR [1]: https://amitness.com/posts/simclr</li>
  <li>NT-XENT 损失函数 [2]: https://www.ymshici.com/tech/2459.html</li>
</ul>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="PaperNote" /><category term="TFC" /><category term="Supervised-Learing" /><category term="SimCLR" /><summary type="html"><![CDATA[通过时间编码和频域编码的自监督算法，一个基于时频一致性的双编码器SimCLR 训练框架]]></summary></entry><entry><title type="html">[文献阅读] SimCLR：简单有效的Supervised-learning 框架</title><link href="https://liuyirigel.github.io/posts/2026/03/paper-note-3/" rel="alternate" type="text/html" title="[文献阅读] SimCLR：简单有效的Supervised-learning 框架" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://liuyirigel.github.io/posts/2026/03/paper-note-3</id><content type="html" xml:base="https://liuyirigel.github.io/posts/2026/03/paper-note-3/"><![CDATA[<p>SimCLR框架，从婴儿到对比学习；从余弦相似到NT-XENT 损失函数</p>

<h2 id="summary">Summary</h2>
<p>写完笔记之后最后填，概述文章的内容，以后查阅笔记的时候先看这一段。注：写文章summary切记需要通过自己的思考，用自己的语言描述。忌讳直接Ctrl + c原文。</p>

<h2 id="research-objectives">Research Objective(s)</h2>
<p>作者的研究目标是什么？</p>

<h2 id="background--problem-statement">Background / Problem Statement</h2>
<p>研究的背景以及问题陈述：作者需要解决的问题是什么？</p>

<h2 id="methods">Method(s)</h2>
<p>作者解决问题的方法/算法是什么？是否基于前人的方法？基于了哪些？</p>

<h2 id="evaluation">Evaluation</h2>
<p>作者如何评估自己的方法？实验的setup是什么样的？感兴趣实验数据和结果有哪些？有没有问题或者可以借鉴的地方？</p>

<h2 id="conclusion">Conclusion</h2>
<p>作者给出了哪些结论？哪些是strong conclusions, 哪些又是weak的conclusions（即作者并没有通过实验提供evidence，只在discussion中提到；或实验的数据并没有给出充分的evidence）?</p>

<h2 id="notesoptional">Notes(optional)</h2>
<p>不在以上列表中，但需要特别记录的笔记。</p>

<h2 id="referencesoptional">References(optional)</h2>
<ul>
  <li>SimCLR [1]: https://amitness.com/posts/simclr</li>
  <li>NT-XENT 损失函数 [2]: https://www.ymshici.com/tech/2459.html</li>
</ul>]]></content><author><name> LiuYi Yu</name><email>oshhhs1@gmail.com</email></author><category term="PaperNote" /><category term="Supervised-Learing" /><category term="SimCLR" /><category term="NT-XENT-Loss-Function" /><summary type="html"><![CDATA[SimCLR框架，从婴儿到对比学习；从余弦相似到NT-XENT 损失函数]]></summary></entry></feed>