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

[DSP][Octave] Analiza dźwięku pod kątem zawartości konkretnej częstotliwości.

smokeing 30 Paź 2011 20:51 3231 6
REKLAMA
  • #1 10083069
    smokeing
    Poziom 12  
    Witam.

    Mam plik WAV, i potrzebuję otrzymać wykres:
    oś x - czas nagrania
    oś y - amplituda harmonicznej o danej częstotliwości w danym czasie

    Przeglądnąłem kilka wykładów w internecie i udało mi się póki co zrobić coś takiego:
    
    [x fs b] = wavread('muzyka.wav');
    
    Y = fft(x);
    plot(abs(Y));
    


    Lecz dostaję widmo sygnału.

    Czy jest możliwe wykonanie tego zadania?

    Z góry dziękuję za wszelkie wskazówki
    smokeing.
  • REKLAMA
  • #2 10083470
    And!
    Admin grupy Projektowanie
    Można robić fft dla kolejnych fragmentów wczytanego pliku.
    Wyniki dla jednego lub więcej pasma częstotliwości,
    można przedstawić na osi czasu.
  • REKLAMA
  • #3 10083748
    smokeing
    Poziom 12  
    Tylko jesli dobrze rozumiem ideę FFT, to im niższą częstotliwość chcę badać tym dłuższe muszą być wycinki dźwięku?

    Jak obliczyć zakres częstotliwości jaki mogę odczytać z nagrania trwającego t sekund?
  • REKLAMA
  • #4 10086181
    And!
    Admin grupy Projektowanie
    Załóżmy że masz próbkowanie 44Khz.
    Mając transformatę z 1024 próbek otrzymasz 512 punktów wyniku.
    Szerokość jednego "prążka" transformaty wyniesie ~43Hz.
    Nie licząc składowej stałej, pierwszy pasek da informacje o mocy na częstotliwości do 43Hz, kolejny o mocy w paśmie 43Hz-86Hz itd.
  • #5 10087666
    __Grzegorz__
    Poziom 30  
    And! napisał:
    Załóżmy że masz próbkowanie 44Khz.
    Mając transformatę z 1024 próbek otrzymasz 512 punktów wyniku.
    Szerokość jednego "prążka" transformaty wyniesie ~43Hz.
    Nie licząc składowej stałej, pierwszy pasek da informacje o mocy na częstotliwości do 43Hz, kolejny o mocy w paśmie 43Hz-86Hz itd.


    Obawiam się, że są to informacje nieścisłe.
    Prążek zerowy będzie miał szerokośc tylko 21,5Hz i załapie się do niego większość energii z pasma 0-21,5Hz (nie wszystko ze względu na przecieki)
    Prążek pierwszy obejmie większość energii z pasma (43-21,5; 43+21,5)...
    n-ty prążek obejmie większość energii z pasma (n*43-21,5 n*43+21,5)
    ostatni prążek będzie, podobnie jak zerowy, o połowę węższy od reszty i obejmie większość energii z pasma od 22000-21,5 do 22000Hz.

    Podejść do problemu poruszonego przez autora można na dwa sposoby opierające się oczywiście o FFT.
    Pierwszy: wczytać kolejno po 2^n próbek, robić FFT i śledzić amplitudy wybranego prążka. Ilość transformat = ceil(długość pliku / 2^n).
    Drugi (moim zdaniem lepszy) - tzw. "sliding FFT", czyli bierzemy 2^n próbek licząc od 0 i robimy FFT, potem znowu 2^n ale od próbki pierwszej, potem drugiej itd. Ilość transformat = ilość próbek w pliku.

    Co zrobić na końcu pliku, gdy punktów do ostatniej (ostatnich) transformat jest za mało - standardowo uzupełnić zerami, i odpowiednio to później zinterpretować....
  • REKLAMA
  • #6 10091059
    piotrek700
    Poziom 13  
    Jeśli chcesz zrobić coś takiego, żeby to porządnie działało to moim zdaniem warto zainteresować się falkami. Jeśli robisz FFT na skończonym sygnale, a zapisany dźwięk niewątpliwie taki jest, to jak zapewne dobrze wiesz trzeba sygnał traktować oknami co powoduje nieznaczne zniekształcenia widma. Różne okna = różne efekty. Falki to nie tak prosta sprawa jak transformacja Fouriera ale na pewno w twojej kwestii i przy ich pomocy da się osiągnąć lepsze wyniki. Jeśli zależy Ci na przetwarzanie sygnału w czasie rzeczywistym i na analizie tylko jednej harmonicznej to zastanowił bym się też na filtrem pasmowym FIR albo IIR. No ale jak chcesz badać szereg harmonicznych to to rozwiązanie odpada.
  • #7 10091577
    kspro
    Poziom 27  
    Wydaje mi się, że w przypadku pojedynczej częstotliwości wykonywanie FFT nie ma sensu. Lepiej zrobić zwykłą DFT albo zastosować algorytm Goertzla.
REKLAMA