Autor Beitrag
RFZ
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: So 11.05.03 18:16 
Moin,
ich will über den Micro-Eingang ein Signal meiner IR-Fernbedienung verarbeiten. Hardwaretechnisch ist das kein Problem. Aber ich hab keine Ahnung wie ich das Signal verarbeiten soll. Im Prinzip besteht das Signal nur aus Pausen und hohen Amplituden, aber wie messe ich diese, und die Zeit dazwischen? Ich hab bereits die TAudioIO Komponenten, komm damit aber nicht besonders zurecht. Das ganze soll möglichst in Echtzeit laufen...

Hier ein Beispiel-Signal:
www.giga-search.de/ir_beispiel.wav
user defined image

cu RFZ


Zuletzt bearbeitet von RFZ am Di 13.05.03 21:44, insgesamt 1-mal bearbeitet
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 12.05.03 12:11 
Ist das Problem nun die Auswertung, oder weisst du nicht, wie du an die Daten herankommst?

Wenn du die Daten z.B in einem Stream hast, ist das ganze nicht so schwer. Du musst einfach einen Schwellenwert festlegen, ab dem sich das Signal verändert. Nehmen wir also mal an, das du das ganze in 16 Bit Auflösung vorliegen hast, dann musst du jedes Word (2 Byte) kontrollieren.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure Auswertung(RawStream,DataStream:Stream);
var Value,Schwellenwert:Word;
var LastSignal:Boolean;
begin
  LastSignal:=False; 
  SchwellenWert:=20000;
  while not RawStream.Eof do
  begin
    RawStream.ReadBuffer(Value,SizeOf(Value));
    //Signaländerung? 
    if (LastSignal) and (Value<Schwellenwert) 
    or (not LastSignal) and (Value>Schwellenwert) then
       LastSignal:=not LastSignal;
    DataStream.Write(LastSignal,SizeOf(LastSignal));
  end;
end;


Evtl. muss das mit dem Prüfen des Schwellenwertes angepasst werden, je nachdem, ob das 0-Signal tatsächlich als 0 ankommt.

Cu, :)
Udontknow
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 12.05.03 12:19 
Uups... :oops:

Sehe gerade, das das ganze wohl ein bisschen anders gemeint war. Vielleicht erzählst du mal etwas über die Art der Modulierung? Was macht eine Null aus, was eine 1? Aus dem Bitmap werde ich nicht recht schlau...

Cu,
Udontknow
RFZ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: Mo 12.05.03 14:50 
Ich weiss vor allem nicht wie ich an die Daten ran komme, in Echtzeit...
Wie würde ich dein Beispiel mit einer WAV-Datei verarbeiten?
In dem Beispiel ist eine lange Pause ne 1, und eine kurze Pause ne 0, aber das ist nebensächlich.

cu RFZ
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 12.05.03 14:54 
Du musst dir aus dem File das Datachunk heraussuchen und dieses entsprechend der Auflösung (8/16 Bit) analysieren. jedes WAV-File besteht aus
- einem RIFF-Chunk (/Segment), das einfach nur angibt, daß es sich um ein Wave-File handelt,
- einem Format-Chunk, in dem unter andem die Auflösung, die Info "Stereo oder Mono" und die Frequenz enthalten ist, und
- dem Data-Chunk, wo der eigentliche Sound abgelegt ist.

Näheres hierzu:
www.technology.niaga...0/WavFileFormat.html

Um in Echtzeit daranzukommen (also die Daten vom Line-In oder MIC-In der Soundkarte abzufangen), solltest du dich mit den DirectSound-Schnittstellen auseinandersetzen. Schau mal beim MSDN vorbei.

Cu,
Udontknow
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: Di 13.05.03 10:06 
Hy,

wenn ich das richtig verstanden habe möchtest Du keine WAV aufnehmen und analysieren, sondern die Daten in echtzeit analysieren und wieder wegschmeißen.

Falls die AudIO Componente von John Mertus ist sollte dies damit kein Problem sein.

Du setzt die Eigenschaften BufferSize, FrameRate, NumBuffers, Quantisation und Stereo und schon kanns losgehen in dem Du das Ereignis OnBufferFilled auswertest.

Zuerst aber ein bischen Theorie.

Ich würde die Parameter wie folgt setzen

FrameRate: 8000
NumBuffers: 4 // 4 Buffer, damit während der Auswertung weiter aufgezeichnet wird
Quantisation: 8 // 8 Bits
Stereo : false // Du hast nur einen Kanal

So jetzt hast Du 8000 Bytes pro Sekunde, jedes Byte entspriched also
125 µs. Du musst noch einen Schwellwert zwichen 0 und 255 festlegen.

Leider lässt sich an Deiner Grafik die Zeitbais nicht genau erkennen. Ich vermute aber, dass Du mit einer BufferSize von 1000 = 125 ms hinkommen müsstest.

Im Ereignis AudioinBufferFilled solltest Du den Buffer auf ein PByteArray casten. Dann kannst Du einfach indiziert auf die Daten zugreifen.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function TMainform.AudioinBufferFilled(Buffer: PChar;
  var Size: Integer): Boolean;
var 
  P:ByteArray;
begin
 P:=Pointer(Buffer);

  ...
end;
RFZ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: Di 13.05.03 21:43 
Danke Matthias, das war genau das was ich gesucht hab :)
Jetzt muss ich mir nur noch überlegen wie ich diese speziellen Muster erkenne, aber das werd ich schon zusammentüfteln können.

cu RFZ