Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Matlab - transformata Fourier dla sygnału EMG

TeKa_ 27 Jan 2012 19:12 4944 4
  • #1
    TeKa_
    Level 9  
    Cześć ;-)

    piszę do Was ze swoim jakże osobistym problemem, który spędza mi sen z powiek od dobrych dwóch nocy.

    Otóż historia wygląda tak: projekt polega na analizie sygnału EMG pod kątem zmęczenia mięśni. Analizy dokonuje się na podstawie wykresu częstotliwościowego więc to co mam trzeba przemielić Fourierem i wypluć jakieś sensowne dane.

    Na stronie Link

    Ładnie opisane jest właściwie wszystko co mam zrobić. Jedynie nie potrafię wygenerować odpowiedniego Fouriera, który powinien wyglądać mniej więcej tak jak poniżej.

    Matlab - transformata Fourier dla sygnału EMG

    Czyli po lewej surowy zapis EMG, a po prawej już przemielony przez fft.

    W Matlabie wygląda to u mnie mniej więcej tak:

    Code:
    clear all;
    
    close all;
    clc

    %Obróbka po imporcie danych

    sampling = 0.0001; %probkowanie
    freq= 10000; % czestotliwosc probkowania



    dane=importdata('pomiar5.dat');

    [dlugosc nic] = size(dane.data); %dlugosc wektora danych
    N=dlugosc;
    %wyznaczanie następnej potęgi dwójki do długości Fouriera
    NFFT=2^nextpow2(N);

    czas=0:sampling:dlugosc/freq-sampling;

    %import danych
    dane1=dane.data(:,2);

    %Fourier właściwy
    Y=fft(dane1,NFFT)/N;
    f=freq/2*linspace(0,1,NFFT/2+1);

    figure(1);
    plot(czas,dane1);

    figure(3);
    plot(f,2*abs(Y(1:NFFT/2+1)));


    Wyniki wyglądają mniej więcej tak:
    -surowe dane
    Matlab - transformata Fourier dla sygnału EMG

    -Fourierek
    Matlab - transformata Fourier dla sygnału EMG

    Napiszcie proszę dobrzy ludzie co robię źle...

    Będę wdzięczny za pomoc ;-)

    Pozdrawiam,
    Tomek
  • #2
    Marvinn8686
    Level 20  
    Mógłbyś udostępnić dane, które poddajesz analizie? Nie widzę żeby były dostępne w linku który zamieściłeś. Mógłbym sprawdzić na nich skrypt, który zrobiłem kiedyś w innym temacie (nie zajmuję się już przetwarzaniem sygnałów w matlabie od dłuższego czasu więc ciężko mi znaleźć na szybko błąd w twoim kodzie). Może sam spróbuj zastosować zamieszczony kod na swoich danych (sam jestem ciekaw wyniku). Tamten temat to:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=6859357#6859357

    Code:

    data = xlsread('ffts2.xls'); % wczytanie danych
    N=1024; %ilosc punktow transformaty musi byc wieksza od liczby punktów, np. dla 8000 to N=8192
    Fs=10000; %czestotliwosc probkowania
    df=Fs/N;  %rozdzielczość transformaty w Hz
    W=abs( fft(data, N) ); %modul widma
    osf=[ 0: N-1 ]*df; %os czestotliwosci w Hz
    figure(1)
    plot(osf(2:40), W(2:40)) %te wartosci w nawiasach pokazuja jaki zakres ma byc na wykresie (40=400Hz)
    title('Widmo czestotliwosci');
    xlabel('Czestotliwosc [Hz]');
    figure(2) %ten sam wykres tylko w decybelach (pierwszy wyglada lepiej)
    plot(osf(2:40), 20*log10(W(2:40))) %te wartosci w nawiasach pokazuja jaki zakres ma byc na wykresie (40=400Hz)
    title('Widmo czestotliwosci w [dB]');
    xlabel('Czestotliwosc [Hz]');


    Dane były tam wczytywane z excela, ale jeśli zmienisz linijkę pierwszą to dalej powinno być podobnie.
    Generalnie nie wyznaczałem osi x dla wykresu transformaty w ten sposób
    Code:
    f=freq/2*linspace(0,1,NFFT/2+1); 
  • #3
    TeKa_
    Level 9  
    Cześć,

    dzięki za odpowiedź ;-)

    Przemieliłem to Twoim kodem i dostałem coś takiego.

    Matlab - transformata Fourier dla sygnału EMG

    Dalej to trochę odbiega od tego co powinno być. Chyba, że po prostu te pomiary nie dadzą innego wyniku.

    W załączniku jeszcze dorzucam moje pomiary. Jakby udało ci się uzyskać coś sensownego to będzie super ;-)

    Pozdrawiam,
    Tomek
  • Helpful post
    #4
    Marvinn8686
    Level 20  
    Cały czas uzyskiwałem rezultaty podobne do twoich - okazało się, że trzeba po prostu zmienić skalę i oglądać tylko początek wykresu, wtedy od biedy przypomina on ten uzyskany w pracy przedstawionej w linku! Tylko przeliczyłem jeszcze jednostkę na osi x [Hz]. Wartości różnią się, jednak skoro w tej pracy nie przedstawiono jednostek, to trudno w ogóle o tym dyskutować.

    Mój ostateczny kod (skrzyżowanie twojego i mojego :) )
    Code:

    clc;
    clear;
     
    fs = 10000; % probkowanie

    dane=importdata('pomiar5.dat');

    y=dane.data(:,2);   % wczytanie danych
    n = length(y)       % dlugosc wektora danych
    NFFT=2^nextpow2(n); % ilosc punktow transformaty - funkcja fft() wyznacza sobie sama, ale bedzie to potrzebne do wykresu

    df=fs/NFFT;             % rozdzielczość transformaty
    osf=[ 0: NFFT-1 ]*df;   % punkty osi czestotliwosci
     
    y_fft = fft(y,NFFT);    % transformata fouriera
    y_fft = abs(y_fft);     % modul widma

    figure(1)
    plot(osf(1:30000), y_fft(1:30000)) % ograniczenie zakresu do interesujacego przedzialu
    title('Widmo czestotliwosci');
    xlabel('Czestotliwosc [Hz]');


    I wygląd wykresu:
    Matlab - transformata Fourier dla sygnału EMG
  • #5
    TeKa_
    Level 9  
    Super!

    Po Twoich mutacjach w końcu to wygląda jak powinno ;-) Ośka x jak zwykle stwarzała problemy.


    Wielkie dzięki za pomoc!! ;-)


    Pozdrawiam,
    Tomek