读取加速度计数据后计算FFT

问题描述 投票:0回答:1

我想检测我拥有的电机上的异常振动。 我正在使用以下设备:

  • 树莓派5
  • Adafruit 加速度计 ISM330DHCX

我已经成功地以特定速率(2000Hz)读取传感器,并且我正在使用它的绝对值(尽管它没有改变那么多):

def read_sensor():
    global data
    target_duration = 1 / SAMPLE_RATE

    # Connect to sensor
    ...

    while True:
        loop_start_time = time.perf_counter()

        x, y, z = accelerometer.acceleration
        acceleration = np.sqrt(x**2 + y**2 + z**2)
        data = np.roll(data, -1)
        data[-1] = acceleration

        # Try to get exactly SAMPLE_RATE per second
        loop_duration = time.perf_counter() - loop_start_time
        sleep_time = max(0, target_duration - loop_duration)
        end_time = time.perf_counter() + sleep_time
        while time.perf_counter() < end_time: pass

然后,我使用

numpy.fft
对上述数据计算 FFT 并将其保存到 CSV 文件中:

n = len(data)
fft = abs(np.fft.fft(data * np.blackman(n)))[:n//2]
amplitudes = np.abs(fft) / n

# Identify max frequencies
max_amplitude = np.max(amplitudes)
max_index = np.argmax(amplitudes)
frequencies = np.fft.fftfreq(n, d=1/n)[:n//2]

# Generate summary
result = {
    'mean': round(data.mean(), 4),
    'std': round(data.std(), 4),
    'max': round(data.max(), 4),
    'min': round(data.min(), 4),
    'range': round(data.max() - data.min(), 4),
    'fft_mean': round(np.mean(fft), 4),
    'fft_std': round(np.std(fft), 4),
    'max_freq': round(frequencies[max_index], 4),
    'max_amp': round(max_amplitude, 4),
    'speed': duty_cycle
}

它产生这样的线条:

mean,std,max,min,range,fft_mean,fft_std,max_freq,max_amp,speed
9.9587,0.1261,10.599,9.5467,1.0523,15.6502,308.3268,0.0,4.1798,47
9.9609,0.1287,10.599,9.5467,1.0523,16.2121,308.5345,0.0,4.1826,47

我在电机上安装了一个螺旋桨,并用一块软塑料敲击螺旋桨。 我知道奈奎斯特频率定理说我只能检测低于

SAMPLE_RATE/2
Hz 的频率。

我的问题如下:

  • 为什么当我添加塑料片时加速度变化不大?
  • 为什么我的 FFT 总是显示 0.0 频率?
  • 我的代码哪里出错了?
python numpy fft
1个回答
0
投票

我使用的是它的绝对值(尽管它变化不大)

前一部分有点令人担忧(

abs(x)
是一个高度非线性的函数),但后一部分意味着你通常不会在零附近振荡。所以在实践中并不是那么明显。

但是,该描述也意味着您的信号有一个非常大的恒定分量。这通常称为“DC”,并且会在 0 Hz 处显示。这是有道理的:直流是信号中根本不会改变的部分。

由于您对非 DC 部分感兴趣,因此应该使用

np.fft.fftfreq(n, d=1/n)[1:n//2]

© www.soinside.com 2019 - 2024. All rights reserved.