logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Widmo szumu białego. Przefiltrowanie filtrem IIR.

janiewiem 04 Lut 2009 17:35 3937 5
  • #1 6102103
    janiewiem
    Poziom 11  
    Witam, mam problem, mam za zadanie wygenerowac szum bialy, wyswietlic jego widmo, nastepnie przefiltrowac filtrem IIR. Problem w tym, ze widmo takiego szumu powinno byc plaskie, tymczasem mi dla czestotliwosci 0 pojawia się prążek wysoki, a przy reszcie dośc równe, płaskie. Prosiłbym o skorygowanie błedu:

    
    clear all;
    close all;
    
    %DANE
    'Częstotliwosc próbkowania [Hz]'
    fs=input('fs= ');
    'Czas obserwacji [s]'
    to=input('to= ')
    N=ceil(to*fs);
    'Czas dyskretny'
    t=N/fs
    
    %Generacja szumu białego
    szum=rand(1,N);
    
    'PARAMETRY WYGENEROWANEGO SZUMU'
    'Wartosc srednia'
    m=mean(szum)
    'Standardowa dewiacja szumu'
    sigma=std(szum)
    
    
    'ANALIZA W DZIEDZINIE CZĘSTOTLIWO?CI'
    PSD=abs(fft(szum));    
    
    figure
    f=(1:N/2)*fs/N;
    
    plot(f,PSD(1,(1:N/2)) )
    hold on
    
  • #2 6103009
    endriu_96
    Poziom 12  
    Prawdopodobnie dałeś f_próbkowania równe f_max, a powinno być conajmniej 2xf_max.
  • #3 6106438
    __Grzegorz__
    Poziom 30  
    a jaka Ci wychodzi z obliczeń wartość średnia?
    Na bank niezerowa. I pewnie sporo różna od 0... Nie jakieś 1e-10 tylko pewnie coś ok 0,5 :)

    Sprawdź z jakiego przedziału liczby generuje ci funkcja rand()

    prawdopodobnie 0-1, więc średnia będzie 0,5 około.

    przy losowaniu odejmij połowę zakresu i będzie gitara :)
  • #4 6107267
    janiewiem
    Poziom 11  
    Hah, racja, generował się szum z zakresu 0-1. Odjąłem więc 0.5 i co prawda zniknęla wysoka wartość dla 0mhz, ale powstal drugi problem, który właściwie nie wiem czy jest problemem :)

    Mianowicie wyobrażałem sobie widmo szumu białego jako linię prostą, taką jak na przykład tu: http://upload.wikimedia.org/wikipedia/commons/f/fe/White_noise_spectral_diagram.jpg

    Ale u mnie to wygląda trochę inaczej. Pytanie - czy tak wygladac ma to widmo? Czy musze po prostu dodac jakis trend do tego? Zalaczam nowy program i dwa obrazki.

    
    %% Generowanie szumu białego
    
    clear all;
    close all;
    
    Fs = 1000   % częst. próbkowania
    T = 1/Fs    % czas dla próbki
    N = 1000    % ilość próbek
    t = (0:N-1)*T  % wektor czasu
    
    x = rand(size(t))-0.5;
    
    plot(Fs*t,x)
    title('Szum bialy')
    xlabel('czas (ms)')
    
    NFFT = 2^nextpow2(N); % Next power of 2 from length of y
    X = fft(x,NFFT)/N;
    f = Fs/2*linspace(0,1,NFFT/2+1);
    
    figure
    % Plot single-sided amplitude spectrum.
    plot(f,2*abs(X(1:NFFT/2+1))) 
    title('Widmo')
    xlabel('Czestotliwosc [Hz]')
    ylabel('|X(f)|')
    


    Szum
    Widmo

    EDIT:

    Naszła mnie mysl, że może dlatego to widmo jest takie, ponieważ jest do szum biały dyskretny a nie ciągły?
  • #5 6110955
    __Grzegorz__
    Poziom 30  
    Widmo szumu białego jest linią prostą.

    Problem w tym, że ty nie wyznaczyłeś FFT dla szumu białego,
    tylko dla szumu białego z nałożonym oknem prostokątnym :)

    Każdorazowo otrzymasz inny rozkład widma....

    Szum biały jest nieograniczony czasowo...

    I teraz ciekawe pytanie - jak estymować widmo szumu białego ? :)

    Jedno z podejść: wygenerować powiedzmy 102400 próbek,
    podzielić na 100 przedziałów po 1024 próbki,
    dla każdego przedziału zrobić FFT
    i otrzymane FFT uśrednić dla każdej częstotliwości...

    Taki eksperyment to fraszka w MATLABIE ... :)
  • #6 6114255
    janiewiem
    Poziom 11  
    Dzięki Grzegorz, byłes niezwykle pomocny :) Wprawdzie nie pisałem tego w czystym Matlabie, ale twój pomysł podsunął mi rozwiązanie, mam nadzieję, że dobre.

    Dla wszystkich, którzy tego szukają:

    Do zbadania FFT użyłem bloczka Spectrum Scope w Simulinku. Na początku wyniki były podobne do moich pierwszych doświadczeń, ale potem porównałem to co mówił Grzegorz z możliwościami tego bloczka i tak Number of spectral averages zmienilem z 2 na 16, bo wydaje mi się, że jest to właśnie ilość tych uśrednień o których mowa. W bloczku należy też ustawić parametry bufora, który jak mi się wydaje dzieli wszystkie próbki na te własnie podgrupy 2^n-elementowe. Tak oto powstały te wyniki, mam nadzieje, że są OK. Ale proszę o potwierdzenie :)

    Skriny
REKLAMA