Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Programowanie a zaawansowane operacje z dźwiękiem?

lukix93 15 Gru 2008 20:07 1448 7
  • #1 15 Gru 2008 20:07
    lukix93
    Poziom 9  

    Nie wiem czy było coś o tym na forum, nie mogę znaleźć. Chciałem za pomocą Delphi / Visual C++ / cokolwiek napisać program, który będzie "umiał" ingerować w falę akustyczną dźwięku, a przez to tworzył efekty typu echo, fuzz, reverb... Coś a'la Audacity+efekty VST :D

    spotkał się kiedyś ktoś z tym?

    0 7
  • Pomocny post
    #2 15 Gru 2008 20:48
    And!
    Admin grupy Projektowanie

    Część efektów zrobisz w dziedzinie czasu: czyli najprostsze zmiana głośności, echo zmiana częstotliwości próbkowania itp.

    Część efektów można zrobić przy pomocy filtrów FIR i IIR: np. equalizer, efekt telefonu itp.

    Inne efekty można zrealizować w dziedzinie częstotliwości korzystając z FFT IFFT DCT.

    Są też efekty z wykorzystaniem specjalnych algorytmów.

    Istnieją też ciekawe sztuczki np. jak pomnożysz próbki przez ciąg (1,-1,1,-1 itd) odwrócisz widmo częstotliwości.

    Na początek potraktuj dźwięk jako tablicę z kolejnymi danymi, i wykonaj na nich różne ciekawe operacje.

    Jeżeli chodzi o cyfrowe przetwarzanie sygnałów zapraszam do:
    DSP

    Można użyć bibliotekę ułatwiającą CPS np. bass.dll

    0
  • #3 17 Gru 2008 16:24
    lukix93
    Poziom 9  

    To jest to co chciałem usłyszeć ;)

    Ale nie dokładnie rozumiem jakiego typu dane mają reprezentować tenże dźwięk :?:

    0
  • Pomocny post
    #4 17 Gru 2008 17:20
    Osmo
    Poziom 18  

    Sciag sobie CoolEdit, tam mozna ładnie zapisac plik wave jako plik tekstowy - ciag próbek - dzieki temu ładnie widac o co w tym chodzi.

    Konkretnie - dzwiek cyfrowy to jak wiadomo sygnał dyskretny, ciąg kolejnych próbek dzwięku.
    Przy 16 bit'ach i 44100Hz bodajże, masz 44100 próbek sygnału na sekunde, każda próbka opisywana jest przez liczbe 16-bitową, zwykle z zakresu -32768 do 32767 lub 0 do 65535.
    Mozna traktowac to jako liczbe całkowitą (wręcz należy), zapisac do tablicy i przekształcac poprzez różne operacje matematyczne, jednoczesnie pilnując by wartośc nie wyskoczyła nam poza zakres.

    na przykład:

    Cytat:
    Istnieją też ciekawe sztuczki np. jak pomnożysz próbki przez ciąg (1,-1,1,-1 itd)

    Mozna zrealizowac na zasadzie:
    Cytat:
    t[k*2] +=1;
    t[k*2+1]+=-1;

    //t - tablica próbek
    //k - kolejne liczby calkowite, ciag powtarza sie okresowo


    FTT to juz nieco wyzsza matematyka, ale mozna skożystac z gotowych bibliotek chocby FTTW.
    W uproszczeniu 'przeniosi' zadany ciag próbek z dziedziny czasu w dziedzinę czestotliwości, dzieki czemu mozna łatwo ingerowac w sygnał, modyfikując wyniki, a potem zastosowac transformate odwrotna, spowrotem uzyskując sygnał w dziedzinie czasu.

    0
  • #5 20 Gru 2008 16:32
    lukix93
    Poziom 9  

    tzn moim tymczasowym celem jest stworzenie programu do efektów gitarowych, jakiś najprostszy fuzz czy coś ;)
    Rozumiem, że do tego trzeba operować FFT?

    0
  • #6 20 Gru 2008 18:38
    Osmo
    Poziom 18  

    Hmm, tak szczeze, to nie bardzo wiem co to jest fuzz ;]

    Ale o ile rozumie idee samego przesterowania, to nie trzeba do tego FTT, wystarczy operowanie na próbkach.

    Cytat:
    Przesterowanie to podanie na wejście liniowego układu elektronicznego sygnału o większym napięciu, niż może on przetworzyć bez zniekształceń.


    Wiec to efekt modyfikujący amplitude sygnału.
    Czyli mozna by dodawac do zadanej próbki jakąś stałą wartośc, lub jakis % i gdy wartosc wychodzi poza zakres 16/8 bitów - obcinac do maxymalnej wartosci.

    FTT jest potrzebne przy efektach gdzie modyfikujesz wartosci sygnału dla zadanych czestotliwości.


    Jesli mówie źle - poprawcie mnie ;)

    Dodano po 3 [minuty]:

    Aha, i pytanie, czy chcesz to robic w czasie rzeczywistym?

    0
  • #7 20 Gru 2008 22:04
    And!
    Admin grupy Projektowanie

    Przesterowywać możesz liniowo czyli wzmacniasz sygnał i przycinasz do wartości maksymalnej,
    można także przesterowywać wg. wybranej funkcji,
    np z zakresu 16b wybierasz powiedzmy 50% natomiast,
    próbki powyżej granicy są wzmacniane np. zgodnie lub odwrotnie z jakąś krzywą wykładniczą a następnie przycinane gdy przekraczają zadaną wartość.

    Także operujesz na próbkach w czasie, i FFT się nie przejmujesz,
    wykonaj poprostu kilka prób na danych, spróbuj do nich dodawać stałą wartość ew przemnożyć je przez wartość powyżej 1 np. 1.6, a następnie przytnij te powyżej 65536 do 65536 (dla 16b).

    0
  • #8 21 Gru 2008 15:48
    lukix93
    Poziom 9  

    Cytat:
    Hmm, tak szczeze, to nie bardzo wiem co to jest fuzz ;]

    Nic innego jak efekt polegający na celowym przesterowaniu sygnału, przynajmniej ja tak to rozumiem ;)

    Cytat:
    Aha, i pytanie, czy chcesz to robic w czasie rzeczywistym?

    Przydałaby się taka opcja ;)

    Spróbowałem pod Audacity w ten sposób, tzn. nagrałem gitarkę, usunąłem na początek szumy i wzmocniłem, pozwalając na przycięcie zbyt mocnych sygnałów. Idealnie :D
    Teraz tylko z teorii na praktykę. Biorę się za prosty program w Delphi, problem w tym, że nie znam jeszcze funkcji do operacji na dźwięku :?

    0