
代码实现了基于TCN(时间卷积网络)和LSTM(长短期记忆网络)的信号降噪和拟合,并对两种方法的效果进行对比分析。
文章目录
程序详解
主要实现步骤
- 数据生成(第7-10行)
- 生成2000个点的合成信号:
sin(t) + 0.3*sin(3*t) - 添加高斯噪声(标准差0.15)模拟真实场景
signal_clean:无噪声的理想信号(作为标签)signal_noise:含噪声的观测信号(作为输入)
- 数据预处理(第12-20行)
- 采用滑窗方法构建监督学习样本
- 窗口大小
win=1(代码中较小,实际可调整) - 输入X:过去win个时刻的噪声观测值
- 标签Y:当前时刻的真实无噪声值
- 目的:训练模型通过历史噪声数据预测当前时刻的干净信号
- 训练集与验证集划分(第22-28行)
- 80%数据用于训练
- 20%数据用于验证和测试
TCN网络实现
网络架构
输入层 → 卷积层1(32滤波器) → ReLU
→ 卷积层2(32滤波器) → ReLU
→ 卷积层3(1滤波器) → 展平 → 回归输出
关键特点:
- 使用
Padding="causal"(因果填充):确保只使用过去信息,不泄露未来数据 - 三层卷积逐步提取时序特征
- 最后一层输出单一预测值
训练配置
- 优化器:Adam
- 学习率:0.001
- 批量大小:32
- 训练轮数:1000
LSTM网络实现
网络架构
序列输入 → LSTM层1(12单元,输出序列) → Dropout(0.3)
→ LSTM层2(6单元,输出最后状态) → 全连接(32)
→ ReLU → 全连接(1) → 回归输出
关键特点:
- 双层LSTM:第一层提取序列特征,第二层聚合信息
- Dropout:防止过拟合(随机失活30%神经元)
- 学习率调度:每40轮衰减到原来的0.3倍
效果评估
- 预测对比图
展示四条曲线:
- 理想值(无噪声真实信号)
- 原始观测数据(含噪声)
- TCN预测结果
- LSTM预测结果
- 误差分析
计算三种误差:
error_:原始噪声误差error_TCN:TCN预测误差error_LSTM:LSTM预测误差
- 统计特性
输出六项指标:
- 各方法的误差均值(反映系统偏差)
- 各方法的误差标准差(反映波动性)
- CDF曲线(累积分布函数)
- 通过直方图统计误差分布
- 绘制累积概率曲线
- 用于评估误差的概率分布特性
运行结果
两种方法的训练曲线:


信号曲线:

各方法的信号误差曲线:

MATLAB部分代码
部分代码如下:
matlab
% TCN(时间卷积网络)与LSTM(长短期记忆)
% 单输入单输出,用于拟合一段信号,便于降噪
% 作者:matlabfilter
% 2025-11-17/Ver1
clear; clc; close all;
rng(0);
%% 生成时间序列数据(带噪声)
N = 2000;
t = linspace(0, 20*pi, N);
signal_clean = sin(t) + 0.3*sin(3*t);
signal_noise = signal_clean + 0.15*randn(size(t));
% 根据过期的点信息来对当前点滤波
win = 1;
X = zeros(win, 1, 1, N-win);
Y = zeros(1, N-win);
for i = 1:N-win
X(:,i) = signal_noise(i:i+win-1);
Y(i) = signal_clean(i+win); % 用无噪声信号作为标签,模拟"不确定标签"
end
%% 分割训练与验证集
numTrain = floor(0.8*(N-win));
XTrain = X(:,1:numTrain);
YTrain = Y(1:numTrain);
XVal = X(:,numTrain+1:end);
YVal = Y(numTrain+1:end);
%% 构建 TCN 网络
numFilters = 32;
filterSize = 3;
layers = [
sequenceInputLayer(1, "Name","input")
convolution1dLayer(filterSize, numFilters, "Padding","causal", "Name","conv1")
reluLayer("Name","relu1")
convolution1dLayer(filterSize, numFilters, "Padding","causal", "Name","conv2")
reluLayer("Name","relu2")
convolution1dLayer(filterSize, 1, "Padding","causal", "Name","conv3")
flattenLayer("Name","flatten")
regressionLayer("Name","output")
];
lgraph = layerGraph(layers);
完整代码
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击联系作者: