AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Oszilloskop und Spektrum

Ein Thema von Peter666 · begonnen am 16. Okt 2021 · letzter Beitrag vom 17. Okt 2021
Antwort Antwort
Peter666

Registriert seit: 11. Aug 2007
339 Beiträge
 
#1

Oszilloskop und Spektrum

  Alt 16. Okt 2021, 18:08
Hi,

ich hab hier ein Projekt bei dem lese ich eine WAV Datei ein und möchte ein Oszilloskop bzw. Spectrum darstellen.
Das Signal liegt in der WAV Datei als 32 Bit signed Integer vor. Hat jemand eine Idee wie ich da für jeden Spur die Daten auslese?

Peter
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
807 Beiträge
 
Delphi 2010 Architect
 
#2

AW: Oszilloskop und Spektrum

  Alt 16. Okt 2021, 18:37
https://www.delphipraxis.net/1244774-post5.html
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.918 Beiträge
 
Delphi 7 Professional
 
#3

AW: Oszilloskop und Spektrum

  Alt 16. Okt 2021, 18:42
Bass.dll und dort in die Demoprogramme schauen.

Hier suchen (lassen) bass dll site:delphipraxis.net

Da bass.dll in einer visuellen Komponente mal reinschauen.
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
339 Beiträge
 
#4

AW: Oszilloskop und Spektrum

  Alt 16. Okt 2021, 20:47
Ui, das ging schnell. Danke für die Antwort. Ehrlich gesagt hab ich dummerweise vor dem Abendessen auf erstellen geklickt in der Hoffnung danach den Text zu bearbeiten und etwas zu konkretisieren.
Bass fällt in dem Fall weg und FFT kann ich auch selber berechnen. Mir ging es eigentlich darum, dass ich nicht wusste wie die 6 Kanäle mit 32bit signed integer Auflösung gespeichert sind. Offenbar 32bit für Kanal 0, dann 32bit für Kanal 1 usw.
Ich weiß aktuell allerdings nicht und das wollte ich eigentlich schreiben, ob jemand eine Idee hat wie man das Oszilloskop für n-Kanäle darstellt. Einfach alle in eine Darstellung scheint mir nicht richtig und alle n-Kanäle separat ist zu unübersichtlich.
Das Problem an dem ich sitze ist, dass sagen wir ich 4 parallel eintrudelnde 6 Kanälige Wavs habe und die sinnvoll darstellen will, ohne den Operator zu überfordern.

Peter
  Mit Zitat antworten Zitat
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
230 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Oszilloskop und Spektrum

  Alt 17. Okt 2021, 10:15
Kommt drauf an was du für eine Auflösung haben willst, aber wie wäre es nur Spitze-Spitze anzuzeigen? Das gibt schöne Hüllkurven.
Man kann auch noch mehr Samples auslassen oder nur alle 100/200ms aktualisieren.
Wie sind die Kanäle verteilt? Alle von der gleichen Quelle würde ich überlagert in verschiedenen Farben darstellen. Alles zusammen sind das ja nur ein "paar" Pixel die man leicht einige male pro Sekunde neu zeichnen kann ohne das das Programm merklich CPU verbraucht.

Generell hat eine WAV Datei ein schön einfaches Format welches gut dokumentiert ist. Es eignet sich super um die Samples einfach auszulesen und damit visuell herumzuspielen.
Stefan
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Jetzt rächt sich die Natur und tötet uns.
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
339 Beiträge
 
#6

AW: Oszilloskop und Spektrum

  Alt 17. Okt 2021, 20:50
Danke,

ich habe jetzt einfach folgendes gemacht. Das Tonsignal mit den 6 Kanälen wandle ich in ein Monosignal mit 16 Bit (AV_SAMPLE_FMT_S16) um und werte das dann aus. Ffmpeg ist recht performant was die Umwandlung angeht und soweit ich das erkenne zeigt mir das Oszilloskop auch die passenden Daten an.

Was ich nicht so ganz verstehe ist, warum ich die Schrittweite durch 4 teilen muss. Das Signal ist ja nur ein Smallint für jeden Wert.

Delphi-Quellcode:
procedure TForm1.ProcessAudio(Buf: PByte; Size: integer);
var
  step, Y, X, V: integer;
  ptr: PSmallInt;

  function FixRange(const Y: integer): integer;
  begin
    Result := Y * 127 div FBitmap.Height;
  end;

begin
  FBitmap.FillTransparent;
  Y := 0;
  X := 0;

  Step := (Size div 4) div FBitmap.Width;
  if Step<1 then Step := 1;
  ptr := PSmallInt(Buf);

  for x := 0 to FBitmap.Width-1 do
  begin
    V := (32767 - ptr^) * FBitmap.Height div 65536;
    inc(ptr, Step);
    if X = 0 then Y := V;
    repeat
      if Y < V then
        Inc(Y)
      else if Y > V then
        Dec(Y);
      FBitmap.SetPixel(X, Y,
        FSpectrumPalette[FixRange(abs(Y - FBitmap.Height div 2) * 2 + 1)]);
    until Y = V;
  end;

  Image1.Picture.Assign(FBitmap);
end;
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf