基于短时傅里叶变换域的一维信号邻域降噪方法(MATLAB)

基于傅里叶变换的信号频域表示及能量频域分布揭示了信号在频域的特征,但傅里叶变换是一种整体变换,只能了解信号的全局特性,不能有效检测信号频率随时间的变化情况。只有把时域和频域结合起来才能更好地反映非平稳信号的特征。时频分析的基本思想是设计时间和频率的联合函数,同时描述信号在不同时间和频率的能量密度或强度。时频分析以联合时频分布的形式来表示信号的特性,克服了傅里叶分析时域和频域完全分离的缺陷,可以较准确地定位某一时刻出现哪些频率分量,以及某一频率分量分布在哪些时刻上。线性时频分析方法主要有:短时傅里叶变换、Gabor变换、小波变换、S 变换等。20世纪40年代Koenig提出了语谱图的方法。短时傅里叶变换由于实现简单已成为分析非平稳信号的有力工具。

STFT 的含义可解释为:在时域用窗函数去截信号h,假定h在窗函数的一个短时间间隔内是平稳的,对截下来的局部信号作傅里叶变换,即得到在t 时刻该段信号的傅里叶变换。不断地移动t,即不断地移动窗函数w的中心位置,可得到不同时刻的傅里叶变换。短时傅里叶变换实际上是一类加窗的傅里叶变换,用窗口函数w把信号划分成许多时间间隔,把每一时间间隔内的信号看作平稳信号,用傅里叶变换分析每一时间间隔,确定在不同时间间隔存在的频率,研究局部时间范围的频域特征。STFT 的优点是:物理意义明确,对整个信号采用单一分辨率进行研究,可以反映信号的整体时频趋势;由于其概念直接,算法简单,实现容易,已经成为研究非平稳信号十分有力的工具,在许多领域(如时变滤波、提高分辨率、地震旋回分析和瞬时属性提取等)得到广泛的应用。

基于此,提出一种基于短时傅里叶变换域的一维信号邻域降噪方法,该方法使用最小控制递归平均方法估计噪声水平,并在STFT域使用Stein无偏风险估计降噪,部分代码如下:

复制代码
function STFTcoef = STFT(f, time_win, factor_redund, f_sampling)
%
% 1D Windowed Fourier Transform. 
%
% Input:
% - f: Input 1D signal.
% - time_win: window size in time (in millisecond).
% - factor_redund: logarithmic redundancy factor. The actual redundancy
%   factor is 2^factor_redund. When factor_redund=1, it is the minimum
%   twice redundancy. 
% - f_sampling: the signal sampling frequency in Hz.
%
% Output:
% - STFTcoef: Spectrogram. Column: frequency axis from -pi to pi. Row: time
%   axis. 
%


% Check that f is 1D
if length(size(f)) ~= 2 | (size(f,1)~=1 && size(f,2)~=1)
    error('The input signal must 1D.');
end

if size(f,2) == 1
    f = f';
end

% Window size
size_win = round(time_win/1000 * f_sampling);

% Odd size for MakeHanning
if mod(size_win, 2) == 0
    size_win = size_win + 1;
end
halfsize_win =  (size_win - 1) / 2;

w_hanning = MakeHanning(size_win); 

Nb_win = floor(length(f) / size_win * 2);

% STFTcoef = zeros(2^(factor_redund-1), size_win, Nb_win-1);
STFTcoef = zeros(size_win, (2^(factor_redund-1) * Nb_win-1));

shift_k = round(halfsize_win / 2^(factor_redund-1));
% Loop over 
for k = 1 : 2^(factor_redund-1)    
    % Loop over windows
    for j = 1 : Nb_win - 2 % Ingore the last few coefficients that do not make a window
        f_win = f(shift_k*(k-1)+(j-1)*halfsize_win+1 : shift_k*(k-1)+(j-1)*halfsize_win+size_win);
        STFTcoef(:, (k-1)+2^(factor_redund-1)*j) = fft(f_win .* w_hanning');
    end
end
%完整代码可由知乎学术咨询获得https://www.zhihu.com/consult/people/792359672131756032

出图如下:

完整代码可由知乎学术咨询获得:

工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》等期刊审稿专家,擅长领域:现代信号处理,机器学习/深度学习,时间序列分析/预测,电气设备(电机,变压器等)表面缺陷检测、电气设备(电机,变压器等)异常检测、电气设备(电机,变压器等)故障诊断与健康管理PHM、电气设备(电机,变压器等)剩余使用寿命预测等。

相关推荐
风象南10 分钟前
普通人用AI加持赚到的第一个100块
人工智能·后端
牛奶40 分钟前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶42 分钟前
前端人为什么要学AI?
前端·人工智能·ai编程
哥布林学者2 小时前
高光谱成像(一)高光谱图像
机器学习·高光谱成像
地平线开发者2 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮3 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者3 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考3 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
冬奇Lab4 小时前
OpenClaw 源码精读(2):Channel & Routing——一条消息如何找到它的 Agent?
人工智能·开源·源码阅读
冬奇Lab4 小时前
一天一个开源项目(第38篇):Claude Code Telegram - 用 Telegram 远程用 Claude Code,随时随地聊项目
人工智能·开源·资讯