Pri práci s meracími údajmi, najmä tými získanými z osciloskopu a uloženými vo formáte CSV, sa často stretávame s potrebou analyzovať a rekonštruovať pôvodný signál. Jednou z kľúčových techník na tento účel je Fourierova transformácia (FFT), ktorá nám umožňuje rozložiť signál na jeho základné frekvenčné zložky. Tento článok sa zameriava na to, ako pomocou MATLABu vykonať FFT, identifikovať dominantné frekvencie a následne rekonštruovať pôvodný signál len z týchto vybraných frekvencií.
Analýza Meracích Dát a Základná FFT
Začíname s meracími údajmi prúdu uloženými v CSV súbore. Tieto údaje, typicky obsahujúce časové značky a namerané hodnoty, sú načítané do MATLABu.
clc;clear all;close all;data = csvread('F0000CH2.CSV');t = data(:,4); % Predpokladáme, že časové údaje sú v 4. stĺpcix = data(:,5); % Predpokladáme, že namerané hodnoty prúdu sú v 5. stĺpciplot(t,x)title('Pôvodný signál prúdu z osciloskopu')xlabel('Čas [s]')ylabel('Prúd [A]')
Po načítaní a vykreslení pôvodného signálu pristúpime k výpočtu diskrétnej Fourierovej transformácie (DFT) pomocou funkcie fft v MATLABe. Výsledok FFT nám poskytuje spektrum signálu, kde môžeme vizuálne identifikovať dominantné frekvencie.
dft = fft(x);plot(abs(dft));title('Spektrum signálu po FFT')xlabel('Frekvencia [Hz]')ylabel('Amplitúda')
Identifikácia Dominantných Frekvencií
Kľúčovou otázkou je, ako presne identifikovať "dominantné frekvencie" z výsledku FFT. Dominantné frekvencie sú tie, ktoré majú najvyššiu amplitúdu v spektrálnom grafe. V praxi to znamená nájsť vrcholy v grafe abs(dft).
Pre presnejšiu identifikáciu môžeme použiť nasledujúci postup:
- Normalizácia FFT: Často je užitočné normalizovať výstup FFT, aby sme získali amplitúdy, ktoré sú menej závislé od dĺžky signálu.
- Vyhľadanie vrcholov: Použijeme funkcie ako
findpeaksna identifikáciu lokálnych maxim v spektre. - Frekvenčná os: Je dôležité správne kalibrovať frekvenčnú os pre graf FFT. Frekvenčné body sú dané vzťahom: $f = k \cdot \frac{Fs}{N}$, kde $k$ je index frekvenčného bodu (od 0 do $N-1$), $Fs$ je vzorkovacia frekvencia signálu a $N$ je počet vzoriek.
Predpokladajme, že poznáme vzorkovaciu frekvenciu $Fs$ signálu. Ak nie je známa priamo, môžeme ju odhadnúť z časových značiek v CSV súbore (napr. $Fs = 1 / (t(2) - t(1))$).
% Predpokladajme, že vzorkovacia frekvencia je známa, napr. Fs = 1000 HzFs = 1000;N = length(x); % Počet vzoriekf = (0:N-1)*(Fs/N); % Frekvenčná os% Vykreslenie spektra s označenými frekvenciamifigure;plot(f, abs(dft));title('Spektrum signálu s kalibrovanou frekvenčnou osou');xlabel('Frekvencia [Hz]');ylabel('Amplitúda');% Nájdeme dominantné frekvencie (napr. top 5)[~, idx] = sort(abs(dft), 'descend');dominant_indices = idx(1:5); % Indexy prvých 5 najväčších amplitúddominant_frequencies = f(dominant_indices);dominant_amplitudes = abs(dft(dominant_indices));disp('Dominantné frekvencie (Hz):');disp(dominant_frequencies);disp('Príslušné amplitúdy:');disp(dominant_amplitudes);
Rekonštrukcia Signálu z Dominantných Frekvencií
Po identifikácii dominantných frekvencií je možné rekonštruovať pôvodný signál použitím inverznej Fourierovej transformácie (IDFT), ale s použitím iba vybraných frekvenčných zložiek. V podstate vytvoríme "čistý" signál, ktorý pozostáva len zo sínusov a kosínusov zodpovedajúcich dominantným frekvenciám.
V MATLABe môžeme rekonštruovaný signál x_reconstructed vytvoriť tak, že v spektre dft ponecháme len hodnoty zodpovedajúce dominantným frekvenciám a ostatné nastavíme na nulu. Následne aplikujeme inverznú FFT.
% Vytvoríme vektor pre rekonštrukciu, inicializovaný nulamidft_reconstructed = zeros(size(dft));% Pridáme dominantné frekvencie späť do rekonštrukčného spektra% Je dôležité zohľadniť symetriu spektra FFT pre reálne signály% Pozitívne a negatívne frekvencie majú rovnakú amplitúdufor i = 1:length(dominant_indices) idx_pos = dominant_indices(i); % Nájdeme zodpovedajúci index pre negatívnu frekvenciu (ak nie je DC zložka) if idx_pos ~= 1 && idx_pos <= N/2 % Kontrola, či ide o frekvenciu inú ako DC a nie je mimo rozsah idx_neg = N - idx_pos + 1; dft_reconstructed(idx_pos) = dft(idx_pos); dft_reconstructed(idx_neg) = dft(idx_neg); elseif idx_pos == 1 % DC zložka (nulová frekvencia) dft_reconstructed(idx_pos) = dft(idx_pos); endend% Aplikujeme inverznú FFT na rekonštruované spektrumx_reconstructed = ifft(dft_reconstructed);% Vykreslíme pôvodný a rekonštruovaný signálfigure;plot(t, x, 'b', 'DisplayName', 'Pôvodný signál');hold on;plot(t, real(x_reconstructed), 'r--', 'DisplayName', 'Rekonštruovaný signál');title('Porovnanie pôvodného a rekonštruovaného signálu');xlabel('Čas [s]');ylabel('Prúd [A]');legend('Location', 'best');
Tento proces nám umožňuje získať aproximáciu pôvodného signálu, ktorá je tvorená len tými najvýznamnejšími frekvenčnými zložkami. Čím viac dominantných frekvencií zahrnieme do rekonštrukcie, tým vernejší bude výsledný signál pôvodnému.
Pokročilé Techniky Rekonštrukcie Signálov v MATLABe
Hoci rekonštrukcia z dominantných frekvencií je účinná, v niektorých situáciách môžeme potrebovať robustnejšie metódy, najmä ak sú dáta neúplné alebo nerovnomerne vzorkované. MATLAB ponúka niekoľko pokročilých techník, ktoré je možné využiť:
Interpolácia
Keď máme signály vzorkované v pravidelných intervaloch, ale s nedostatočnou hustotou, môžeme použiť interpolačné metódy na odhad hodnôt medzi známymi vzorkami.
Lineárna Interpolácia: Najjednoduchšia metóda, ktorá spája susedné body priamymi čiarami. V MATLABe ju reprezentuje funkcia
interp1s metódou'linear'. Hoci je jednoduchá, výsledok nemusí byť dostatočne hladký pre signály s vysokými deriváciami.% Príklad lineárnej interpoláciet_fine = linspace(t(1), t(end), 1000); % Jemnejšia časová osx_linear_interp = interp1(t, x, t_fine, 'linear');figure;plot(t, x, 'o', 'DisplayName', 'Pôvodné vzorky');hold on;plot(t_fine, x_linear_interp, '-', 'DisplayName', 'Lineárna interpolácia');title('Lineárna interpolácia');xlabel('Čas [s]');ylabel('Prúd [A]');legend('Location', 'best');Spline Interpolácia: Pre signály, ktoré sú nielen spojité, ale majú aj spojité derivácie (ako sú sínusové signály), je spline interpolácia vhodnejšia. Funkcia
interp1s metódou'spline'alebo'pchip'poskytuje hladšie výsledky.% Príklad spline interpoláciex_spline_interp = interp1(t, x, t_fine, 'spline');figure;plot(t, x, 'o', 'DisplayName', 'Pôvodné vzorky');hold on;plot(t_fine, x_spline_interp, '-', 'DisplayName', 'Spline interpolácia');title('Spline interpolácia');xlabel('Čas [s]');ylabel('Prúd [A]');legend('Location', 'best');

Pre vzorkovanie so Zrkadlením (Resampling) a Antialiasing Filtrami
Funkcia resample v Signal Processing Toolbox poskytuje ďalšiu techniku na dopĺňanie chýbajúcich dát, ktorá zahŕňa aj antialiasing filtrovanie. Toto je obzvlášť užitočné pri zmene vzorkovacej frekvencie alebo pri odhadovaní chýbajúcich segmentov signálu.
% Príklad použitia resamplenew_Fs = 2 * Fs; % Nová, vyššia vzorkovacia frekvencia[x_resampled, t_resampled] = resample(x, t, new_Fs); % Použitie pôvodných časových značiek pre správnu kalibráciufigure;plot(t, x, 'b', 'DisplayName', 'Pôvodný signál');hold on;plot(t_resampled, x_resampled, 'r', 'DisplayName', 'Signál po resample');title('Rekonštrukcia signálu pomocou resample');xlabel('Čas [s]');ylabel('Prúd [A]');legend('Location', 'best');
Funkcia resample má tendenciu dobre rekonštruovať centrálne časti signálu, ale môže mať problémy s presnosťou na koncoch.
Autoregresívne Modelovanie pre Rekonštrukciu Veľkých Medzier
Keď sú v signáli prítomné rozsiahle medzery, samotná interpolácia alebo jednoduché pre vzorkovanie nemusí byť dostatočné. V takýchto prípadoch, najmä pre oscilačné javy, môžeme predpokladať, že signál v okolí medzery sa dá modelovať pomocou autoregresívneho procesu. Tieto procesy majú informácie rozložené v čase, čo umožňuje predpovedať chýbajúce vzorky na základe predchádzajúcich alebo nasledujúcich dát.
MATLAB ponúka funkciu fillgaps (v starších verziách alebo ako súčasť Signal Processing Toolbox), ktorá dokáže odhadnúť chýbajúce vzorky na základe autoregresívneho modelovania. Môže byť použitá globálne na celom signáli alebo lokalizovane v okolí medzery.
% Príklad s predpokladom chýbajúcich dát (simulácia medzery)% Vytvoríme umelú medzeru v dátachx_with_gap = x;gap_start_idx = round(length(x) * 0.4);gap_end_idx = round(length(x) * 0.6);x_with_gap(gap_start_idx:gap_end_idx) = NaN; % Označíme medzeru ako NaN% Rekonštrukcia pomocou fillgaps% fillgaps vyžaduje, aby sme špecifikovali, ako sa má modelovať (napr. 'ar' pre autoregresívne)% Pre ukážku použijeme interpolačnú metódu, ktorá je dostupnejšiax_filled_interp = fillgaps(x_with_gap, 'linear'); % Použijeme lineárnu interpoláciu na vyplnenie NaNfigure;plot(t, x_with_gap, 'o', 'DisplayName', 'Signál s medzerou');hold on;plot(t, x_filled_interp, '-', 'DisplayName', 'Signál po vyplnení medzery (interpolácia)');title('Rekonštrukcia signálu s chýbajúcimi dátami');xlabel('Čas [s]');ylabel('Prúd [A]');legend('Location', 'best');
Ak chceme použiť pokročilejšie autoregresívne modelovanie, je potrebné sa obrátiť na špecifické funkcie alebo implementovať algoritmy ako ARMA alebo Kalmanov filter, ktoré sú štandardnými nástrojmi v oblasti spracovania signálov.
Fourierova transformácia na osciloskope
Zhrnutie Metód Rekonštrukcie
V závislosti od charakteru signálu a povahy chýbajúcich dát môžeme použiť rôzne techniky na rekonštrukciu:
- Rekonštrukcia z dominantných frekvencií: Ideálna pre signály, ktoré sú dobre aproximované súčtom sínusov a kosínusov. Poskytuje "vyčistenú" verziu signálu, odstrániac šum a menej významné zložky.
- Interpolácia (lineárna, spline): Vhodná pre signály, kde sú dáta vzorkované príliš riedko. Poskytuje odhad hodnôt medzi známymi bodmi. Spline interpolácia je preferovaná pre hladšie signály.
- Pre vzorkovanie (Resampling): Umožňuje zmeniť vzorkovaciu frekvenciu a doplniť dáta, pričom zohľadňuje antialiasing.
- Autoregresívne modelovanie: Najsilnejšia metóda pre rekonštrukciu rozsiahlych medzier v signáloch, ktoré vykazujú predvídateľné časové závislosti.
Každá z týchto metód má svoje výhody a nevýhody a voľba závisí od špecifických požiadaviek aplikácie a charakteristík meraných dát. Dôležité je tiež uvedomiť si, že žiadna rekonštrukcia nemôže úplne nahradiť stratené informácie, ale môže poskytnúť užitočnú aproximáciu.
tags: #rekonstrukcia #signalu #matlab