Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Die Soundkarte im Informatikunterricht © 2001 Klaus J. Koch, Marburg Was ist eine Soundkarte? Verwendung als Analog-I/O in der Schule Vorbereitungen, Programmierung.

Ähnliche Präsentationen


Präsentation zum Thema: "Die Soundkarte im Informatikunterricht © 2001 Klaus J. Koch, Marburg Was ist eine Soundkarte? Verwendung als Analog-I/O in der Schule Vorbereitungen, Programmierung."—  Präsentation transkript:

1 Die Soundkarte im Informatikunterricht © 2001 Klaus J. Koch, Marburg Was ist eine Soundkarte? Verwendung als Analog-I/O in der Schule Vorbereitungen, Programmierung in Delphi Samplen und Darstellen Erfassen und Auswerten Erzeugen und Wiedergeben einer Datei Direkte Ausgabe Weitere Informationsquellen, Diskussion Deutscher Verein zur Förderung des mathematischen und naturwissenschaftlichen Unterrichts Landesverband Hessen, 30. Hessische Landestagung, 5. September 2001 in Marburg, 14:30 Uhr, HS 113

2

3 Didaktische Begründung Siehe entsprechende Beiträge aus den 80er Jahren Hohe Motivation bei Schülern (und Lehrern) überzeugende Demonstration des EVA-Prinzips EVA

4 Was ist eine Soundkarte? (1) Die erste Sound Blaster für IBM-PCs wurde von Creative Labs bereits 1989 eingeführt. DOS-Treiber verfügbar. Ursprünglich häufigster Einsatzbereich: Aufpeppen von PC-Spielen durch Sound-Effekte. Daher der Game-Port auf jeder Soundkarte. Außerdem Wiedergabe von Audio-CDs. Daher früher oft Anschluß für diverse CD-ROM- Laufwerke vorhanden. Selten benutzt, aber Standard: Eingänge

5 Analoge Eingänge: Line Mikrofon Audio-CD Was ist eine Soundkarte? (2) Analoge Ausgänge [Line] Kopfhörer [Lautsprecher] Zusätzliche Optionen wie digitale Ein-/Ausgänge, Wavetable, MIDI etc. werden hier nicht behandelt.

6 Was ist eine Soundkarte? (3) Einige zusätzliche technische Angaben: der Mikrofon-Eingang unterstützt i.a. nur ein Mono- Mikrofon. Auf dem für den zweiten Kanal vorgesehenen Stift liegt oft eine Hilfsspannung (1,5 - 5 V) für Mikrofonvorverstärker. Der ist meist auch erforderlich! Falls kein Lautsprecher-Anschluß vorhanden ist, können an den Line- oder Kopfhörer-Ausgang auch Kleinlautsprecher mit angeschlossen werden. An dem GAME-Anschluß liegt u.a. eine Spannung von 5 V. Achtung: Dieser Anschluß ist i.a. nicht abgesichert!

7 Verwendung als Analog-I/O in der Schule Vorteile: durch Treiber ins Betriebssystem eingebunden, keine Peeks und Pokes hohe Auflösung: 16 Bit hohe Geschwindigkeit: Samples/s 2 Kanäle Oft ohne Aufpreis enthalten (Notebook) Nachteile: nur für Wechselspannungen ab ca. 20 Hertz für manche Zwecke zu langsam Eingangsempfindlichkeit (modellabhängig) oft zu niedrig

8 Vorbereitungen, Programmierung in Delphi Einbau und Installation einer Soundkarte (falls noch nicht erfolgt. Gedenket der Interrupts und DMAs!) Beschaffen einer geeigneten Delphi-Komponente (Empfohlen: AudioIO.ZIP * von John Mertus, weil mit Sourcen, verwendbar ab Delphi 2!) und Installation * ) zu finden auf:

9 Alternativen zur eigenen Programmierung Verwendung separater Programme zur Kommunikation mit der Soundkarte (Schreiben der erfassten Daten in eine Datei bzw. Ausgabe einer Datei an die Soundkarte), z.B. Cooledit, Goldwave, etc. zur Datenmanipulation, Auswertung, Aufbereitung und Darstellung mit Tabellenkalkulationsprogramm, z.B. Excel

10 Konventionelle Programmierung ohne Ereignissteuerung Start T=time V=input T=T+dt time

11 Samplen und Darstellen (1) Vergessen Sie Peeks und Pokes Unter Windows werden Ressourcen bereitgestellt und Botschaften versandt Die Puffergröße unterliegt den üblichen Systembegrenzungen. Mono, 16 Bit, Samples/s, Size=1MByte ergibt 22,67 Sekunden.

12 Samplen und Darstellen (2) function TForm1.AudioIn1BufferFilled(Buffer: PChar; var Size: Integer): Boolean; var SP : ^SmallInt; i, N, v, xMin, xMax : Integer; begin N := Size div 2; // sizeof(smallint) = 2 SP := Pointer(Buffer); xMin := SP^; xMax := xMin; for i := 0 to N-1 do begin v := SP^; Inc(SP); if xMin > v then xMin := v; if xMax < v then xMax := v; end; if Min > xMin then Min := xMin; if Max < xMax then Max := xMax; TempMax := xMax; if Abs(xMin) > xMax then TempMax := Abs(xMin); Result := TRUE; end; (aus dem Beispiel des Autors) Diese Methode ermittelt jedesmal, wenn der Puffer gefüllt wurde, den Maximalwert, der in dieser Zeitspanne auftrat.

13 Samplen und Darstellen (3) Allein durch Ereignissteuerung wird die Hardware natürlich nicht schneller. (Eher im Gegenteil!) Aber: Das Übertragen der Meßwerte vom Eingabeport in den Puffer erfolgt jetzt durch DMA (Direct Memory Access) ohne Beanspruchung der CPU. Die Bedingung Verarbeitungszeit < Meßintervall gilt jetzt nicht für einen Meßwert, sondern gemittelt für N Meßwerte, wobei N die Puffergröße ist.

14 Samplen und Darstellen (4) function TForm1.AudioIn1BufferFilled(Buffer: PChar; var Size: Integer): Boolean; type puffer = array[ ] of SmallInt; var zeiger : ^puffer; i, x, N : Integer; begin N := Size Div 2; zeiger := Pointer(Buffer); i := 0; // zeigt in den Puffer x := 0; // zeigt auf den Oszi-Schirm PaintBox1.Canvas.MoveTo(x,128+zeiger^[i] div 256); while i < N do begin PaintBox1.Canvas.LineTo(x,128+zeiger^[i] div 256); inc(i); inc(x); end; Result := TRUE; end; Hier haben wir bereits einen vollständigen Oszillographen. Es fehlen lediglich noch Anweisungen zum Löschen des vorhergehenden Bildschirms und Algorithmen zur Triggerung.

15 function TForm1.AudioIn1BufferFilled(Buffer: PChar; var Size: Integer): Boolean; var SP : ^Byte; i, N, v : Integer; const f = 5; begin N := Size; SP := Pointer(Buffer); with Canvas do FillRect(ClientRect); Canvas.Pen.Color := clLime; // zeichne links das Ende von letztem Puffer Canvas.MoveTo(0,128+f*(rechts[0]-128)); for i := 0 to 255 do Canvas.LineTo(i,128+f*(rechts[i]-128)); Canvas.Pen.Color := clRed; // zeichne rechts den Anfang von neuem Puffer v := SP^; Inc(SP); for i := 0 to 255 do begin v := SP^; Inc(SP); Canvas.LineTo(256+i,128+f*(v-128)); end; SP := Pointer(Buffer); // kopiere das Ende von neuem Puffer Inc(SP,N-256); // in ein temporäres Array for i := 0 to 255 do // begin rechts[i] := SP^; Inc(SP); end; Result := TRUE; end; Samplen und Darstellen (5) Visuelle Prüfung, ob das Ende des vorausgehenden Puffers mit dem Anfang des folgenden Puffers stetig fortgesetzt wird. Vertrauen Sie fremden Puffern?

16 Wer sich die Arbeit mit dem Canvas sparen will, kann einfach die in Delphi enthaltene TChart-Komponente benutzen. Samplen und Darstellen (6) function TMiniOszi.AudioIn1BufferFilled(Buffer: PChar; var Size: Integer): Boolean; var i, N, v : integer; SP : ^SmallInt; begin Chart1.Series[0].Clear; N := Size div 2; SP := Pointer(Buffer); for i := 0 to N-1 dDo begin v := SP^; Inc(SP); Chart1.Series[0].AddXY(i, v, '', clBlack) end; result := true; end;

17 Samplen und Darstellen (7) Wenn man einen kleinen Magneten an dieser Induktionsspule vorbeiführt, ergibt sich das nebenstehende Bild. Falls kein Telefonadapter zur Hand, genügt auch eine 3000-Wdg-Spule aus der Physik-Sammlung mit einem entsprechenden Übergangskabel. Beispiel für einen Freihandversuch mit der Soundkarte: Zur Zeit der altmodischen (nichtelektronischen) Telefonapparate gab es Induktionsspulen mit Saugfuß, um eigene Telefongespräche auf dem Cassettenrecorder mitzuschneiden. Diese haben bereits den für die Soundkarte benötigten 3,5mm-Stecker.

18 Erfassen und Auswerten (1) Aufgabenbeispiel: Es sollen Ereignisse gezählt werden, die durch folgende Eigenschaften spezifiziert sind: Ein Ereignis hat eine bestimmte Mindestamplitude Zwei Ereignisse werden durch eine Pause von einer bestimmten Mindestdauer unterbrochen, in der die Mindestamplitude nicht erreicht wird.

19 Erfassen und Auswerten (1a) Zur Definition eines Impulses Impulse sehen in der Realität meist nicht so aus wie einem die Literatur es weismachen will. Abstand Schwelle Die Festlegungen von Schwelle und Abstand sind mehr oder weniger willkürlich.

20 Erfassen und Auswerten (2) function TForm1.AudioIn1BufferFilled(Buffer: PChar; var Size: Integer): Boolean; var SP : ^SmallInt; i, N, v : Integer; begin N := Size div 2; SP := Pointer(Buffer); for i := 0 to N-1 do begin v := SP^; Inc(SP); t := pz*N+i; case zustand of BinInPause : WarteAufEreignis; WarteAufPause : WarteAufEreignisEnde; end; inc(pz); Result := TRUE; end; procedure WarteAufEreignis; begin if abs(v) > MindestAmpl then begin zustand := WarteAufPause; Shape1.Brush.Color := clRed; inc(zaehler); Label1.Caption := IntToStr(zaehler); tEvent := t; end; procedure WarteAufEreignisEnde; begin if abs(v) > MindestAmpl then tEvent := t; if t - tEvent > PausenDauer then begin zustand := BinInPause; Shape1.Brush.Color := clGreen; end;

21 Erfassen und Auswerten (3) Viele akustische Signale, z.B. Musikinstrumente, werden sinnvollerweise in der Frequenzverteilung analysiert. Um dies während der Erfassung durchzuführen, ist die konventionelle diskrete Fourieranalyse zu langsam. Erst mit der Fast-Fourier-Analyse kann in Echtzeit ausgewertet werden. Die zugrundeliegenden Algorithmen sind jedoch i.a. für die Behandlung in der Schule zu komplex.

22 Erzeugen und Wiedergeben einer Datei Für das programmgesteuerte Abspielen einer Sound-Datei gibt es mehrere Möglichkeiten: Unit MMSystem: SndPlaySound('Clock.wav',0) Unit Classes: TMemoryStream Komponente TMediaPlayer: MediaPlayer1.Filename := 'Clock.wav'; MediaPlayer1. Open; MediaPlayer1. Play;

23 Aufbau von Dateien im WAV-Format Alle bisherigen Versuche zum effektiven und verlustfreien Komprimieren von Audio-Dateien müssen als gescheitert betrachtet werden. (MP3 ist hochkompliziert und nicht verlustfrei!) Nur so ist es zu erklären, daß das unkomprimierte Windows-Format *.WAV (genauso wie das entsprechenden Graphik-Format *.BMP) nach wie vor so weit verbreitet ist. Die Analyse des Aufbaus gelingt durch Vergleich einiger Audio-Dateien:

24 Direkte Ausgabe (1) Vergessen Sie Peeks und Pokes Unter Windows werden Ressourcen bereitgestellt und Botschaften versandt

25 Direkte Ausgabe (2) function TForm1.AudioOut1FillBuffer(Buffer: PChar; var Size: Integer): Boolean; var P : ^SmallInt; I, tp, N : Integer; const Freq = 440; begin N := Size div 2; P := Pointer(Buffer); for i := 0 to N-1 do begin tp := N*AudioOut1.FilledBuffers+i; P^ := Round(MaxShort*Sin(2*pi*tp*Freq/AudioOut1.FrameRate)); Inc(p); end; Result := TRUE; end; Beim Start werden zunächst alle 4 Puffer mit Daten gefüllt. Erst dann wird mit der Ausgabe begonnen. Sobald ein Puffer abgearbeitet ist, fordert er neue Daten an. In der Zwischenzeit wird erst mal der nächste Puffer abgearbeitet. Ton mit konstanter Frequenz 440 Hz

26 Direkte Ausgabe (2a) DREIECK SÄGEZAHN SINUS RECHTECK Je nach Qualität von Sound- karte, Endstufe und Belastung sind die Resultate mehr oder weniger zufrieden- stellend.

27 Direkte Ausgabe (3) function TForm1.AudioOut1FillBuffer(Buffer: PChar; var Size: Integer): Boolean; var P : ^SmallInt; I, tp, N : Integer; begin Label1.Caption := Format('Frequenz: %8.1f Hz',[freq]); N := Size div 2; P := Pointer(Buffer); for i := 0 to N-1 do begin tp := N*AudioOut1.FilledBuffers+i; P^ := Round(MaxShort*Sin(2*pi*tp*freq/AudioOut1.FrameRate)); Inc(p); freq := freq* ; end; Result := freq < ; // stop, wenn 20 kHz erreicht end; Diese Methode sollte einen gleichmäßig ansteigenden Ton erzeugen. Klingt aber merkwürdig... Ton mit ansteigender Frequenz Anfangsfrequenz muß vorher festgelegt worden sein.

28 Direkte Ausgabe (4) function TForm1.AudioOut1FillBuffer(Buffer: PChar; var Size: Integer): Boolean; var P : ^SmallInt; I, tp, N : Integer; fneu : extended; begin Label1.Caption := Format('Frequenz: %8.1f Hz',[freq]); N := Size div 2; P := Pointer(Buffer); for i := 0 to N-1 do begin inc(sample); tp := N*AudioOut1.FilledBuffers+i; P^ := Round(MaxShort*Sin(2*pi*tp*freq/AudioOut1.FrameRate+phase)); Inc(p); fneu := freq* ; phase := 2*pi*tp/AudioOut1.FrameRate*(freq-fneu)+phase; freq := fneu; end; Result := freq < ; // stop, wenn 20 kHz erreicht end; Erst mit einer Phasenkorrektur ergibt sich das gewünschte Ergebnis.

29 Direkte Ausgabe (5) Beispiel für akustische Täuschungen: Ein Klang, der aus drei Teiltönen besteht; deren Tonhöhe fortlaufend ansteigt. Erreicht ein Ton die obere Frequenzgrenze, so wird sie auf die unter Frequenzgrenze zurückgesetzt, um erneut anzusteigen. Damit dieser Vorgang unkenntlich gemacht wird, wird die Amplitude der Teiltöne an den Frequenzgrenzen auf Null abgesenkt. (nach R. Shepard)

30 Weitere Informationsquellen (1) W. Stein: Versuche mit der Soundkarte. Aus der Klett-Buchreihe Impulse Physik. ISBN F. Bönsel (Ober-Ramstadt): Schallwellen mit der PC-Soundkarte vermessen. Vortrag auf der 26. MNU-Landestagung am in Darmstadt S. Schaal, G. Braune: Physik lernen am Fahrrad. Gert Braune (Humboldt-Schule Kiel/IPN): Fachübergreifende Unterrichtsprojekte mit der Soundkarte. Vortrag auf der 47. MNU-Tagung in Bremerhaven am Versuchsanleitungen der TU München.

31 Weitere Informationsquellen (2) Using a sound card in QBasic. FreeVIEW sound Gymnasium Korschenbroich: Messung der Schallgeschwindigkeit mit einer Soundkarte. Messungen zum freien Fall mit der Soundkarte. Eine Messung zum Dopplereffekt. Akustische Täuschungen

32 Diskussion Das vorgestellte Material ist abrufbar unter: Fortführung der Diskussion in Form einer öffentlichen Mailingliste. an:


Herunterladen ppt "Die Soundkarte im Informatikunterricht © 2001 Klaus J. Koch, Marburg Was ist eine Soundkarte? Verwendung als Analog-I/O in der Schule Vorbereitungen, Programmierung."

Ähnliche Präsentationen


Google-Anzeigen