rysowanie waveform, problem z plynnym przesuwaniem...

0

czesc

kombinuje z tym od paru godzin i nic nie wymyslilem, moze ktos wpadnie jak sie z tym uporac:
rysuje sobie canvasem "waveform".
dokladniej robie to tak:
mam tablice z próbkami (co 20ms) glosnosci dzwieku.
potem wyliczam ile probek przypada na jeden pixel "wykresu"
wyciagam z tych probek srednia arytmetyczną i rysuje ta wartosc na wykresie.
proste.

generalnie wszystko jest ok, z jednym malym szczegółem ktory strasznie mnie wnerwia:
zalozmy, ze narysuje wykres, ktory reprezentuje dzwiek od 0 do 10s.
a teraz narysuje wykres kawalek dalej, np od 2 do 12s.
czyli wykres powinien sie przesunac o te 2sek.
i tak sie dzieje, ale problem w tym, ze nie jest to idealne przesuniecie :/
zamiast płynnego przsuwania wykresu powstaje taki efekt:
user image

jakies pomysly?

0

Taki efekt wynika zapewne z błędów zaokrągleń. Ilość pikseli w poziomie i ilość próbek nie "współgrają" ze sobą.

Aczkolwiek trzeba by zobaczyć kod, by powiedzieć więcej.

0

przypuszcza, że przesuwasz po próbce a nie po pixelu - chodzi mi o to, że jak np. na jeden pixel składa się 5 próbek to masz je tak (z każdej grupy wyciągasz średnią)

12345 67890 12345
1 23456 78901 2345
12 34567 89012 345
123 45678 90123 45
1234 56789 01234 5
12345 67890 12345

a powinieneś tak
12345 67890 12345
67890 12345 12345
12345 12345 67890
12345 67890 12345

0

Misiekd, nie do konca wiem o co Ci chodzi...
oto kod:

// WaveformData : array[0..180000] of Byte; //tu siedza probki z glosnoscia. kazda probka=20ms
{...}
var i : integer;
    x : integer;
    y : integer;
    samplesPerPx : real;//integer
    FFrom   : integer;  //milisekundy, od tego miejsca dzwieku bedzie rysowany wykres.
    FTo     : integer;  // koniec wykresu w ms.
    FLength : integer;  //Fto-FFrom.
begin
{...}
  Image1.Canvas.FillRect(Image1.Canvas.ClipRect)

  for x:=0 to Image1.Width do
      begin
        //licze ile probek przypada na pixel
        samplesPerPx:=(FLength / 20) / Image1.Width;
        if samplesPerPx=0
           then Break;

        //licze srednia z probek przypadajacych na 1px
        i:=0;
        y:=0;
        repeat
           y:=y+WaveformArray[round((x*samplesPerPx)+i +(FFrom/20) )]; //sumujemy probki ktore przypadaja na 1px
           Inc(i);
        until i>=samplesPerPx;
        y:=round(y / i); //wyciagamy srednia - dzielimy sume przez liczbe probek.

        //rysuje
        Image1.Canvas.MoveTo(x, 75-(y div 2)); //75 to polowa wysokosci image'a
        Image1.Canvas.LineTo(x, 75+(y div 2));
      end;
end;
0

Chodzi o to, żeby wartość FFrom była wielokrotnością wartości ms/piksel.


p.s. nie wiem jakie to mam mieć zastosowanie, ale dlaczego liczysz średnią, zamiast liczyć wartości maksymalne?

0

0x666, Misiekd, Rev.pl... Dzieki [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1