Pierwsze kroki z programmatic audio [zamknięte]

Szukam pomocy w rozpoczęciu pracy programowo z audio.

W szczególności platforma, na której pracuję, udostępnia interfejsy API do wyodrębniania danych audio z zasobu (np. MP3) lub odtwarzania dowolnych danych jako audio. W obu przypadkach rzeczywistymi danymi są tablice bajtowe 32-bitowych pływaków reprezentujących 44,1 KHz stereo. To, czego szukam, to pomoc w zrozumieniu, co te pływaki reprezentują i jakie rzeczy można z nimi zrobić, aby dynamicznie analizować lub modyfikować dźwięk reprezentują.

Jakich pojęć muszę się nauczyć, aby pracować z audio w ten sposób?

Author: fenomas, 2008-12-14

4 answers

Jak niektórzy zauważyli w komentarzach, to, co chcesz przyjrzeć się, to PCM audio.

W skrócie, dźwięk jest falą, która przemieszcza się w powietrzu. Aby uchwycić ten dźwięk, używamy mikrofonu , który zawiera membranę, która będzie wibrować, gdy fale dźwiękowe uderzają w niego. Drgania te przekładają się na sygnał elektryczny, gdzie napięcie idzie w górę iw dół. Ta zmiana napięcia jest następnie zamieniana na sygnał cyfrowy przez analogowo-cyfrowy przetwornik (ADC) przez próbkowanie określonej liczby razy na sekundę ("sampling rate" - 44 KHz, czyli 44 100 próbek na sekundę) i, w obecnym przypadku, przechowywany jako dane audio modulowane kodem impulsowym (PCM).

Głośnik pracuje odwrotnie; sygnał PCM jest konwertowany na analogowy przez konwerter cyfrowo-analogowy (DAC), następnie sygnał analogowy trafia do głośnika, gdzie wibruje membrana, która wytwarza wibracje w powietrzu, co powoduje dźwięk.

Manipulowanie Dźwiękiem

Istnieje wiele bibliotek dla wielu języków, którymi można manipulować dźwiękiem, jednak zaznaczyłeś to pytanie jako "język-agnostyczny", wspomnę o kilku prostych sposobach (bo to wszystko, co wiem!), że będziesz mógł manipulować dźwiękiem w preferowanym przez Ciebie języku.

Przedstawię próbki kodu w pseudokodzie.

Pseudokod będzie miał amplitudę każdej próbki audio w zakresie od -1 do 1. To będzie zależeć od typu danych używanego do przechowywania każdej próbki. (Wcześniej nie miałem do czynienia z 32-bitowymi floats, Więc może być inaczej.)

Wzmocnienie

W celu wzmocnienia dźwięku, (a więc zwiększenia głośności dźwięku) będziesz chciał, aby wibracje głośników były większe, aby wielkość fali dźwiękowej została zwiększona.

Aby głośnik poruszał się bardziej, musisz zwiększyć wartość każdego z nich próbka:

original_samples = [0, 0.5, 0, -0.5, 0]

def amplify(samples):
    foreach s in samples:
        s = s * 2

amplified_samples = amplify(original_samples)

// result: amplified_samples == [0, 1, 0, -1, 0]

Powstałe próbki są teraz wzmacniane przez 2, a podczas odtwarzania powinny brzmieć znacznie głośniej niż wcześniej.

Cisza

Kiedy nie ma wibracji, nie ma dźwięku. Milczenie może być osiągnięte przez upuszczenie każdej próbki do 0 lub do dowolnej określonej wartości, ale nie ma żadnej zmiany amplitudy między próbkami:
original_samples = [0, 0.5, 0, -0.5, 0]

def silence(samples):
    foreach s in samples:
        s = 0

silent_samples = silence(original_samples)

// result: silent_samples == [0, 0, 0, 0, 0]

Odtwarzanie powyższego powinno spowodować brak dźwięku, ponieważ membrana na głośniku w ogóle się nie porusza, ze względu na brak zmiany amplitudy w próbkach.

Speed Up and Down

Przyspieszenie w górę i w dół można osiągnąć na dwa sposoby: (1) zmiana częstotliwości próbkowania odtwarzania lub (2) zmiana samych próbek.

Zmiana częstotliwości próbkowania odtwarzania z 44100 Hz na 22050 Hz spowoduje zmniejszenie szybkości odtwarzania o 2. Spowoduje to, że dźwięk będzie wolniejszy i niższy w tonie. Idąc ze źródła 22 KHz i odtwarzając z 44 KHz, dźwięk będzie bardzo szybki i wysoki jak ptaki ćwierkające.

Zmiana samych próbek (i utrzymanie stałej częstotliwości próbkowania odtwarzania) oznacza, że próbki (a) są wyrzucane lub (b) są dodawane.

aby przyspieszyć odtwarzanie dźwięku, wyrzuć próbki:

original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5]

def faster(samples):
    new_samples = []
    for i = 0 to samples.length:
        if i is even:
            new_samples.add(samples[i])
    return new_samples

faster_samples = faster(original_samples)

// result: silent_samples == [0, 0.2, 0.4]

Wynikiem powyższego programu jest to, że dźwięk przyspieszy się o współczynnik 2, podobnie jak odtwarzanie dźwięku, który próbkował przy 22 KHz przy 44 KHz.

aby spowolnić odtwarzanie audio, wrzuć kilka sampli:

original_samples = [0, 0.1, 0.2, 0.3]

def slower(samples):
    new_samples = []
    for i = 0 to samples.length:
        new_samples.add(samples[i])
        new_samples.add(interpolate(s[i], s[i + 1]))
    return new_samples

slower_samples = slower(original_samples)

// result: silent_samples == [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3]

Tutaj dodano dodatkowe sample, co spowolniło odtwarzanie. Tutaj mamy interpolation funkcję, która sprawia, że "zgaduję", jak wypełnić tę dodatkową przestrzeń, która zostanie dodana.

Analiza widma i modyfikacja dźwięków przez FFT

FFT (ang. Fast Fourier transform FFT)-szybka transformata Fouriera (FFT), w której dane dźwiękowe z dziedziny amplitudy i czasu mogą być odwzorowane na dziedzinę częstotliwości i czasu. Komponenty audio. Może to być wykorzystane do produkcji analizatorów widma , które można zobaczyć w ulubionym odtwarzaczu audio.

Nie tylko to, ponieważ teraz masz składniki częstotliwości dźwięku, jeśli zmienisz Ilość

Jeśli chcesz odciąć określone częstotliwości, możesz użyć FFT, aby przekształcić dane dźwiękowe W domenę częstotliwości-czasu i zerować składniki częstotliwości, które nie są pożądane. To się nazywa filtrowanie .

wykonanie filtra górnoprzepustowego, co pozwala na częstotliwości powyżej określonej częstotliwości można wykonać tak:

data = fft(orignal_samples)

for i = (data.length / 2) to data.length:
    data[i] = 0

new_samples = inverse_fft(data)

W powyższym przykładzie wszystkie częstotliwości nad znacznikiem półdrożnym są odcięte. Tak więc, jeśli dźwięk może wytworzyć 22 KHz jako maksymalną częstotliwość, każda częstotliwość powyżej 11 KHz zostanie wycięta. (Dla dźwięku odtwarzanego z częstotliwością 44 KHz, maksymalna teoretyczna częstotliwość jaką można wytworzyć to 22 KHz. # Patrz Nyquist-Shannon twierdzenie o próbkowaniu .)

Jeśli chcesz zwiększyć zakres niskich częstotliwości (podobny do efektu Bass boost), weź dolną część danych przekształconych przez FFT i zwiększ ich wielkość:]}
data = fft(orignal_samples)

for i = 0 to (data.length / 4):
    increase(data[i])

new_samples = inverse_fft(data)

Ten przykład zwiększa dolną część składowych częstotliwości dźwięku, co prowadzi do tego, że niskie częstotliwości stają się głośniejsze.


Jest sporo rzeczy, które można zrobić z samplami, aby manipulować dźwiękiem. Po prostu idź i eksperyment! To najbardziej ekscytujący sposób na naukę.

Powodzenia!
 95
Author: coobird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-13 21:22:16

Wygląda na to, że chcesz wiedzieć więcej o PCM audio

Zasadniczo każda 32-bitowa wartość reprezentuje poziom napięcia w określonym czasie. Ponieważ częstotliwość próbkowania wynosi 44100Hz, otrzymujesz 441000 wartości 32 bitów na sekundę na kanał (*2, ponieważ masz stereo)

Z dźwiękami stereo lewy i prawy kanał jest często przeplatany tak, że pierwsza próbka reprezentuje lewy kanał, a druga prawy, i tak dalej.

 4
Author: some,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-14 06:15:04

Aby zrozumieć, co reprezentują tablice 32-bitowych pływaków, musisz przeczytać dobre wprowadzenie do cyfrowego dźwięku.

Jeśli jesteś w pobliżu Biblioteki "the computer Music Tutorial" Curtisa Roadsa może być przydatny. W szczególności rozdział pierwszy "Cyfrowe koncepcje Audio". (Dawno nie czytałem tej książki).

Kiedy już zrozumiesz cyfrowe audio, istnieje wiele sposobów na manipulowanie nim. Kiedy będziesz gotowy, te linki mogą pomóc.

Wtyczka DSP + Forum programistyczne w Kvr Audio to jedno miejsce do zadawania pytań. Posty tutaj są ogólnie podzielone na ogólne tematy wtyczek audio DSP i VST.

MusicDsp ma wiele fragmentów kodu.

Przewodnik naukowca i inżyniera do cyfrowego przetwarzania sygnałów Jest darmową książką tekstową online, która dogłębnie porusza standardowe tematy DSP. Wiele z nich dotyczy również dźwięku cyfrowego.

 3
Author: Shannon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-22 09:42:52

Ostatnio zamieściłem podobne pytanie: dobre poradniki audio dsp .

Złotym linkiem jest z pewnością Audio EQ cookbook , jeśli chcesz pisać i rozumieć EQs, ale bardziej ogólnie, musicdsp.org archive to najlepszy zasób, jaki znalazłem dla kodowania audio DSP.

Oto filmik Synta ("Soundoid"), który stworzyłem we Flashu: http://www.youtube.com/watch?v=O-1hHiA7y4o

I możesz się nim bawić tutaj: http://www.zachernuk.com/2011/03/28/soundoid-audio-synthesizer-v0-5/

 1
Author: aaaidan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:35