FFT og frekvensanalyse: Forstå vibrasjonssignaler

Avansert6 min lesetid

Et akselerometer som logger rådata gir deg bare halve historien – de interessante fenomenene som lagerfeil, ubalanse og resonans gjemmer seg i frekvensdomenet. La oss se på hvordan Fast Fourier Transform avslører det tidsdomenet skjuler, og hvordan du unngår de klassiske fallgruvene i praktisk vibrasjonsanalyse.

Hva du trenger

  • Akselerometer (f.eks. MPU6050, ADXL345 eller industrielt IEPE-sensor)
  • Mikrokontroller eller DAQ med kjent, stabil samplingsrate
  • Python 3 med NumPy, SciPy og Matplotlib
  • Et testobjekt med kjent vibrasjonskilde (motor, vifte, ubalansert hjul)
  • Eventuelt et oscilloskop for å verifisere rådata

FFT-intuisjon: fra tid til frekvens

La oss starte med det konseptuelle. Et vibrasjonssignal i tidsdomenet er en sum av sinusoider med ulik amplitude, frekvens og fase. Problemet er at det menneskelige øyet – og de fleste algoritmer – har vanskelig for å plukke ut disse komponentene direkte fra en kaotisk tidsserie.

Fourier-transformen bygger på en elegant idé: ethvert periodisk (eller tilnærmet periodisk) signal kan dekomponeres til en sum av sinus- og cosinusbølger med ulike frekvenser. Fast Fourier Transform (FFT) er simpelthen en effektiv algoritme for å beregne den diskrete Fourier-transformen (DFT), som reduserer kompleksiteten fra O(N²) til O(N log N).

Output fra en FFT er et kompleks tall for hver frekvensbinne – magnituden forteller deg hvor mye energi som finnes ved den frekvensen, mens fasen forteller deg tidsforskyvningen. For de fleste vibrasjonsanalyser er det magnitudespekteret (eller effektspekteret) du er ute etter.

Tips: Tenk på FFT som et prisme. Akkurat som et prisme splitter hvitt lys i fargespekteret, splitter FFT et sammensatt vibrasjonssignal i dets frekvenskomponenter.

Sampling-teoremet: grunnlaget du ikke kan ignorere

Nyquist-Shannon samplingsteorem sier at samplingsfrekvensen fs må være minst dobbelt så høy som den høyeste frekvenskomponenten du ønsker å observere korrekt. Dette høres enkelt ut, men i praksis er det her de fleste feil oppstår.

Hvis et signal inneholder frekvenskomponenter over fs/2 (Nyquist-frekvensen), vil disse «foldes tilbake» og manifestere seg som falske, lavere frekvenser i spekteret ditt – et fenomen kjent som aliasing. Dette er spesielt lumsk fordi aliasing-artefakter ser helt legitime ut; de har ikke noe «feil-stempel» på seg.

  • Regel: Velg fs ≥ 2.5 × fmax som praktisk margin, ikke nøyaktig 2×
  • Anti-aliasing filter: Bruk alltid et analogt lavpassfilter før ADC-konvertering hvis sensoren eller forsterkerkretsen kan produsere støy over Nyquist
  • MEMS-akselerometre som MPU6050 har ofte innebygde digitale lavpassfilter (DLPF) du bør konfigurere eksplisitt

Tips: Sjekk alltid databladet til akselerometeret for båndbredde og innebygd filtrering. For MPU6050 (InvenSense-dokumentasjon) kan DLPF settes via register 0x1A, og dette påvirker både støynivå og effektiv Nyquist-grense.

Python-implementasjon: fra rådata til spekter

La oss gå gjennom en komplett pipeline med NumPy og SciPy.

import numpy as np
from scipy.fft import rfft, rfftfreq
from scipy import signal

# Eksempeldata: 3-akse akselerometer, 1 akse brukt
fs = 1000  # samplingsfrekvens i Hz
N = 2048   # antall samplepunkter (helst potens av 2)

# Simulert signal: 50 Hz grunnfrekvens + 120 Hz harmonisk + støy
t = np.arange(N) / fs
raw_signal = (1.0 * np.sin(2*np.pi*50*t) +
              0.3 * np.sin(2*np.pi*120*t) +
              0.05 * np.random.randn(N))

# Fjern DC-komponent (gjennomsnitt) før FFT
raw_signal = raw_signal - np.mean(raw_signal)

# Påfør vindusfunksjon (se neste seksjon)
window = signal.windows.hann(N)
windowed_signal = raw_signal * window

# Beregn FFT (rfft for reelle signaler er raskere)
fft_result = rfft(windowed_signal)
freqs = rfftfreq(N, 1/fs)

# Amplitudespekter med korrekt skalering
amplitude = np.abs(fft_result) * 2 / N
amplitude_correction = 1 / np.mean(window)  # kompenser for vindustap
amplitude_corrected = amplitude * amplitude_correction

# Finn dominerende frekvens
peak_idx = np.argmax(amplitude_corrected)
print(f"Dominerende frekvens: {freqs[peak_idx]:.2f} Hz")

Legg merke til rfft i stedet for standard fft – siden vibrasjonsdata alltid er reelle (ikke komplekse) verdier, gir dette halvparten så mange beregninger og et mer oversiktlig ensidig spekter.

Vindusfunksjoner: hvorfor du ikke kan hoppe over dette

En rå FFT antar implisitt at signalet ditt er periodisk innenfor vinduet du analyserer. Hvis signalet ikke starter og slutter på samme verdi (noe det nesten aldri gjør i praksis), introduserer du diskontinuiteter som lekker energi over hele spekteret – kjent som spektral lekkasje.

Vindusfunksjoner dempe signalet mot null ved kantene, noe som reduserer lekkasjen betraktelig på bekostning av litt redusert frekvensoppløsning.

  • Hann-vindu: Godt allround-valg, god balanse mellom lekkasjeundertrykkelse og oppløsning
  • Hamming-vindu: Litt bedre sidelobe-undertrykkelse enn Hann, brukes ofte i talegjenkjenning
  • Flat-top-vindu: Best amplitudenøyaktighet, men dårligere frekvensoppløsning – ideelt for kalibrering
  • Blackman-Harris: Utmerket for å skille nærliggende frekvenser med store amplitudeforskjeller

Tips: Bruk flat-top-vindu når du trenger nøyaktig amplitudemåling (f.eks. å verifisere kalibrering mot en kjent vibrasjonsstandard), og Hann når du primært er interessert i frekvensposisjon.

Praktisk analyse: fra spekter til diagnose

Når du har et rent spekter, er neste steg å tolke det i lys av maskinens fysikk:

  1. Identifiser grunnfrekvensen – ofte knyttet til rotasjonshastighet (RPM/60 = Hz)
  2. Se etter harmoniske – topper ved 2×, 3×, 4× grunnfrekvensen indikerer ofte mekanisk slark eller ubalanse
  3. Sjekk for sidebånd – symmetriske topper rundt en hovedfrekvens kan indikere lagerfeil eller modulasjon
  4. Bruk spektrogram for tidsvarierende signaler – scipy.signal.spectrogram() gir deg et 2D-bilde av frekvens over tid, uvurderlig ved oppstart/nedkjøring
f, t_spec, Sxx = signal.spectrogram(raw_signal, fs, window='hann',
                                      nperseg=256, noverlap=128)

For reelle industrielle akselerometre fra RoboNordics sensorutvalg, husk at mekanisk montering (stivhet, klemkraft) påvirker overføringsfunksjonen betydelig – et løst montert sensor dempter høyfrekvent informasjon og kan introdusere falske resonanser.

Datainnsamling Akselerometer ADC / Mikrokontroller Signalbehandling (Python) Fjern DC- komponent Vindus- funksjon FFT (rfft) Magnitudespekter Tolkning Topp-deteksjon Harmonisk- analyse Diagnose: lager/ubalanse

Vanlige feil

  • Glemmer anti-aliasing filter: Resulterer i falske frekvenstopper som ser fullstendig legitime ut – svært vanskelig å feilsøke i ettertid
  • Ignorerer DC-offset: En ufjernet gjennomsnittskomponent skaper en enorm topp ved 0 Hz som kan maskere lavfrekvente signaler av interesse
  • Bruker ikke vindusfunksjon: Fører til spektral lekkasje som sprer energi fra en skarp topp utover nabobinner, og kan skjule svakere signaler
  • Feil FFT-lengde relativt til oppløsningsbehov: Frekvensoppløsningen er fs/N – for kort vindu gir grov oppløsning som ikke skiller nærliggende frekvenser
  • Stoler blindt på amplitude uten vinduskorreksjon: Ulike vinduer har ulik «coherent gain» som må kompenseres for nøyaktige amplitudemålinger

Tips: Ved tvil om samplingsraten er tilstrekkelig, kjør et raskt sveip med kjent referansefrekvens (f.eks. en kalibrert shaker) og verifiser at FFT-toppen havner akkurat der forventet.

Avsluttende betraktninger

FFT-basert vibrasjonsanalyse er et kraftig verktøy, men presisjonen står og faller med forståelsen av samplingsteori, vindusfunksjoner og riktig skalering. Når du mestrer disse grunnprinsippene, åpner det døren til avansert tilstandsovervåking – prediktivt vedlikehold, ubalansediagnose og strukturell helseovervåking blir plutselig innen rekkevidde med rimelig maskinvare.

Skal du sette opp et eget vibrasjonsmåleoppsett, finner du akselerometre og tilhørende sensorer i RoboNordics sortiment som fungerer godt sammen med denne typen Python-basert signalbehandling.

Kilder: SciPy-dokumentasjon (scipy.fft, scipy.signal), InvenSense MPU-6050 Register Map and Descriptions, Nyquist, H. «Certain topics in telegraph transmission theory» (1928).

Mer om robotikk og styring

Se alle →