You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

变速转轴加速度计数据FFT与阶次分析合理性问询

关于变速转轴加速度计数据FFT与阶次域的疑问

我正在处理变速旋转转轴的加速度计数据,尝试做FFT分析,目前已经完成了以下步骤:

  • 原始数据是时域波形,先做了阶次分析(重采样),得到了以转轴角度(弧度)为横轴、幅值为纵轴的角度域数据
  • 用下面的Python代码执行FFT:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
class FastFourierTransform:
    # Amplitudes is a row vector
    def __init__(self, amplitudes, t):
        self.s = amplitudes
        self.t = t
    # Plotting in the input domain before fft
    def plot_input(self):
        plt.ylabel("Amplitude")
        plt.xlabel("Shaft angle [Radians]")
        plt.plot(self.t, self.s)
        plt.margins(0)
        plt.show()
    ''' The second half of this array of fft sequence have similar frequencies since the frequency is the absolute value of this value. '''
    def fft_transform(self):
        mean_amplitude = np.mean(self.s)
        self.s = self.s - mean_amplitude # Centering around 0
        fft = np.fft.fft(self.s)
        # We now have the fft for every timestep in out plot.
        # T is the sample frequency in the data set
        T = self.t[1] - self.t[0] # This is true when the period between each sample in the time waveform is equal
        N = self.s.size # size of the amplitude vector
        f = np.linspace(0, 1 / T, N, ) # start, stop, number of. 1 / T = frequency is the bigges freq
        plt.ylabel("Amplitude")
        plt.xlabel("Frequency [Hz]")
        y = np.abs(fft)[:N // 2] * 1 /N # Cutting away half of the fft frequencies.
        sns.lineplot(f[:N // 2], y) # N // 2 is normalizing it
        plt.margins(0)
        plt.show()
        time = f[:N // 2]
        return fft, time
  • 得到了归一化幅值的FFT结果图

现在我有个疑问:我这个分析思路是正确的吗?最终得到的FFT图到底是处于频域(Hz)还是阶次域?我看到相关资料说阶次分析后的FFT结果应该是阶次域,但因为我是基于弧度域的序列做的FFT,对此有点困惑,也参考过Tomasz Barszcz的《Vibration-Based Condition Monitoring of Wind Turbines》里的相关图像,希望能得到解答。


解答

首先得明确核心区别:角度域重采样后的FFT,输出的其实是阶次域,而不是传统的Hz频域。咱们一步步理清楚:

  1. 阶次重采样的意义
    你做的阶次分析重采样,本质是把原本随时间变化的振动数据,转换成随转轴角度变化的数据——相当于把变速的时间轴“拉直”成了等角度间隔的序列。这一步完全正确,是处理变速旋转机械振动的标准操作,目的就是消除转速波动的影响,让与转轴旋转相关的振动分量能被稳定捕捉。

  2. FFT结果的物理意义
    看你代码里的FFT部分:你用的T = self.t[1] - self.t[0],这里的t已经是角度(弧度),不是时间!所以1/T并不是Hz单位的频率,而是“每弧度对应的振动周期数”。你生成的f数组,实际代表的是阶次(Order),而不是Hz频率。

传统FFT处理时域数据时,横轴是Hz(1/时间);但处理角度域数据时,FFT的横轴是阶次——阶次的定义就是“振动频率与转轴旋转频率的比值”,比如1阶对应转轴每转1次振动1次(不平衡故障特征),2阶对应每转振动2次(不对中故障特征)。当你把数据对齐到转轴角度后,FFT的结果直接对应阶次,这正是阶次分析的核心目标:不管转速怎么变,都能准确定位到与转轴旋转相关的振动阶次。

  1. 你的代码需要调整的地方
  • 代码里的plt.xlabel("Frequency [Hz]")是错误的,应该改成plt.xlabel("Order")
  • 阶次轴的计算可以更准确:用np.fft.fftfreq来生成频率轴,再转换成阶次。比如:
    d_theta = self.t[1] - self.t[0]
    freq_per_rad = np.fft.fftfreq(N, d=d_theta)[:N//2]
    order = freq_per_rad * 2 * np.pi  # 转换成每转的周期数(阶次)
    
    这样得到的order就是正确的阶次轴,替代你原本的f数组。
  1. 思路正确性总结
  • 先做阶次重采样(角度域对齐)这一步是完全正确的
  • 但你对FFT结果的物理意义理解有误,最终得到的是阶次域结果,不是Hz频域,这和你参考的资料、书籍内容是一致的。

内容的提问来源于stack exchange,提问作者meerkat

火山引擎 最新活动