2014-10-30 23 views
5

Próbuję narysować kształt fali z nieprzetworzonego pliku audio. Demuxowałem/dekodowałem plik audio przy pomocy FFmpeg i mam te informacje: bufor próbek, rozmiar bufora próbek, czas trwania pliku audio (w sekundach), częstotliwość próbkowania (44100, 48000, itp.), Wielkość próbki, próbka format (uint8, int16, int32, float, double) i same nieprzetworzone dane audio.Algorytm do generowania kształtu fali z audio

Kopanie w Internecie znalazłem ten algorytm (więcej here):

White Noise:

White Noise

algorytmu

Wszystko, co musisz zrobić, to losowo każda próbka od -amplitude do amplitudy. W większości przypadków nie zależy nam na liczbie kanałów, więc po prostu wypełniamy każdą próbkę nową liczbą losową.

Random rnd = new Random(); 
short randomValue = 0; 

for (int i = 0; i < numSamples; i++) 
{ 
    randomValue = Convert.ToInt16(rnd.Next(-amplitude, amplitude)); 
    data.shortArray[i] = randomValue; 
} 

To naprawdę dobre, ale nie chcę, aby zwrócić w ten sposób, ale w ten sposób:

audacity

Czy istnieje algorytm lub pomysł jak mogę być rysowanie za pomocą informacje, które mam?

+0

Wygląda na to, że próbujesz użyć algorytmu generującego fale ** generującego **, gdy już masz swoją falę. Brzmi dla mnie tak, jakbyś nic nie robił. – Galik

+0

@Galik - Co masz na myśli mówiąc "już masz swoją falę"? Jedyne, co mam, to informacje o surowym pliku wymienionym powyżej, teraz szukam algorytmu do narysowania fali za pomocą tych informacji. – yayuj

+0

Cóż, połączone algorytmy nie mają nic wspólnego z rysowaniem fali. Generują falę. Wygenerowałeś falę, używając ffmpeg do konwertowania nieprzetworzonych danych dźwiękowych. Więc nie potrzebujesz generatora. Sądzę, że być może potrzebujesz czegoś w rodzaju GUI framework, który pozwala rysować rzeczy na ekranie. – Galik

Odpowiedz

5

Najpierw należy ustalić, gdzie na ekranie znajdzie się każda próbka.

int x = x0 + sample_number * (xn - x0)/number_of_samples; 

Teraz, dla wszystkich próbek z tej samej x określić minimalną i maksymalną oddzielnie dla wartości dodatnie i ujemne. Narysuj linię pionową, ciemną od ujemnej maksimum do dodatniej maksimum, a następnie jasną od ujemnej min do pozytywnej min na górze.

Edytuj: myśląc o tym trochę więcej, prawdopodobnie chcesz użyć średniej zamiast minimalnej dla linii wewnętrznych.

1

Dolne wykresy zawierają po prostu dłuższy okres czasu, więc jeśli zwiększysz liczbę numSamples, uzyskasz bardziej zwarty wykres. Ale z białym szumem nie zobaczysz szczytów i koryt, które znajdziesz w normalnych dźwiękach/muzyce.

Jeśli więc możesz zwiększyć swój rozmiar próbki lub przynajmniej zwiększyć okres próbkowania (oś x), zaczniesz emulować dolne wykresy. Użyj dwóch z nich, aby uzyskać efekt stereo.

3

Istnieje niezły program audiowaveform z BBC R & D, który robi to, co chcesz, możesz skonsultować swoje źródła.

+0

Na pewno ci to pomoże. Dzięki. – yayuj

3

Myślę, że odnosisz się do przebiegu opisanego tutaj.

http://manual.audacityteam.org/o/man/audacity_waveform.html

nie czytałem całą stronę. Ale każdy pionowy pasek reprezentuje okno próbek przebiegu. Ciemnoniebieski to maksymalna dodatnia i minimalna wartość ujemna w tym oknie (myślę). A jasnoniebieski to RMS, który jest kwadratowy średni. http://www.mathwords.com/r/root_mean_square.htm. (w zasadzie wyrównaj wartości w każdym oknie, weź średni, a następnie pierwiastek kwadratowy.

Mam nadzieję, że to pomoże.

1

showwavespic

ffmpeg może pobierać fali z filtru showwavespic.

enter image description here

ffmpeg -i input -filter_complex "showwavespic=split_channels=1" output.png 

Zobacz showwavespic filter documentation dla opcji.

showwaves

Można także film z przebiegu żywo z filtrem showwaves.

ffmpeg -i input -filter_complex \ 
"showwaves=s=600x240:mode=line:split_channels=1,format=yuv420p[v]" \ 
-map "[v]" -map 0:a -movflags +faststart output.mp4 

Zobacz opcje showwaves filter documentation.

1

Drugi kształt fali jest prawdopodobnie przybliżeniem kolumny prostego wykresu zygzakowatego.

Każda kolumna jest linią od poprzedniej amplitudy próbki do aktualnej amplitudy próbki.

Tak więc przeczytaj wszystkie próbki w płótnie lub teksturze jako test wstępny jako kropki, a następnie, gdy już to zrobisz, możesz zrobić dwa przypadki, zrobić paski zamiast kropek, narysować w górę do ostatniej próbki lub w górę do tego próbka w zależności od tego, która wartość była większa, o ile narysujesz linię od do dwóch. Zapewnia to, że kształt fali jest mały przy niskich energiach między kolejnymi próbkami i wysokim z wysoką energią.

Można go aliasować i mierzyć wiele próbek, zależy to tylko od tego, na jakim sprzęcie pracujesz, jeśli chcesz odczytać 1000 próbek próbek i zrobić gigantyczną reprezentację w postaci tablicy 2d fali, a następnie sprowadzić ją w dół do mniejszego wyświetlacza. obrazu lub jeśli chcesz uruchomić tylko 512 próbek i aktualizować szybko. w programie 2d płótno w programach powinno być szybkie, aby tworzyć szczegółowe przebiegi z więcej niż 512 próbek.

... inna opcja jest taka sama jak szara fala w drugiej odpowiedzi, narysuj wartość bezwzględną jako linie od + próbki bieżącej do bieżącej próbki.

Pomaga uśrednić wiele próbek, tj. Zawsze 4 próbki lub uzyskać maksimum co 4 próbki, aby mieć mniej błędny wykres, jest dzieckiem szybkiego aliasingu.

+0

Zrobiłem trochę kodu w oparciu o użycie wykresu słupkowego do przybliżenia zygzakiem, znalazłem funkcje rysowania płótna jako nieco wolne dla pamięci, stwierdziłem, że jeśli podzielisz 44100 na 8 lub 16, użyj maksimum na 16 próbek , nadal wygląda bardzo jasno, SR jest wtedy 2900 na sekundę, jest w porządku i oszczędza pamięć ... Stwierdziłem, że karta graficzna była znacznie szybsza do wyświetlania wierzchołków niż próba zrobienia tego w tekście, więc zrobiłem grapy z płaskim wieloboki jako linie, w kanwie 2d jest dużo szybszy, i tak pewnie byś tęsknił w porównaniu do wysyłania graficznego shadre do polis. kod dx11 to onunityforum – predatflaps

Powiązane problemy