[mp3, wav, flac] Wie Amplitudenwerte aus Audiodatei extrahieren?
spacer
Autor Nachricht
g1o2k4
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Di 18.10.11 21:29 
Betrifft: mp3, wav, flac
hi zusammen,

ich hab mir eine Platine mit digital-analog wandler gebastelt, den ich über UART bzw. serielle schnittstelle (COM Port) ansteuern kann. ich möchte mal versuchen audio damit zu erzeugen. daher die frage wie ich aus einer audio datei die amplitudenwerte des zeitsignals extrahiert bekomme. das format ist mir egal, am besten das format das am einfachsten ist.
die serielle schnittstelle und das programm dazu ist alles schon fertig. ich möchte jetzt quasi nur sowas wie:

ausblenden Quelltext markieren
1:
2:
3:
4:
for i:=0 to max(datei_werte)do
begin
serial.port.sendbyte(datei_werte[i]);
end;


die mp3 codierung ist ja glaub ich ziemlich komplex. was ist das einfachste audio format, in dem vielleicht schon sowas wie amplitudenwerte gespeichert sind? kann jemand helfen oder vielleicht sogar schon code oder eine lib anbieten?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 287
Erhaltene Danke: 31

Win 7
Delphi XE, Delphi 7, Delphi 3; Lazarus
BeitragVerfasst: Di 18.10.11 21:53 
ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
procedure Tform1.MakeSound(Frequency, Duration : integer);
var
WaveFormatEx : TWaveFormatEx;
MS : TMemoryStream;
i, TempInt,
DataCount,
RiffCount : integer;
SoundValue : byte;
w : double; // omega ( 2 * pi * frequency)
const
Mono : Word = $0001;
SampleRate : integer = 11025; // 8000, 11025, 22050, or 44100
RiffId : string = 'RIFF';
WaveId : string = 'WAVE';
FmtId : string = 'fmt ';
DataId : string = 'data';
begin
with WaveFormatEx do begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := Mono;
nSamplesPerSec := SampleRate;
wBitsPerSample := $0008;
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
nBlockAlign := (nChannels * wBitsPerSample) div 8;
cbSize := 0;
end;
MS := TMemoryStream.Create;
with MS do begin
{Calculate length of sound data and of file data}
DataCount := (Duration * SampleRate) div 1000; // sound data
RiffCount := Length(WaveId)
+ Length(FmtId) + SizeOf(DWord)
+ SizeOf(TWaveFormatEx)
+ Length(DataId) + SizeOf(DWord)
+ DataCount; // file data
{write out the wave header}
Write(RiffId[1], 4); // 'RIFF'
Write(RiffCount, SizeOf(DWord)); // file data size
Write(WaveId[1], Length(WaveId)); // 'WAVE'
Write(FmtId[1], Length(FmtId)); // 'fmt '
TempInt := SizeOf(TWaveFormatEx);
Write(TempInt, SizeOf(DWord)); // TWaveFormat data size
Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
Write(DataId[1], Length(DataId)); // 'data'
Write(DataCount, SizeOf(DWord)); // sound data size
{calculate and write out the tone signal} // now the data values
w := 2 * Pi * Frequency; // omega
for i := 0 to DataCount - 1 do begin
// wt = w *i /SampleRate
SoundValue := 127 + trunc(127 * sin(i * w / SampleRate));
Write(SoundValue, SizeOf(Byte));
end;
// you could save the wave tone to file with :
// MS.Seek(0, soFromBeginning);
// MS.SaveToFile('C:\MyFile.wav');
// then reload and play them without having to
// construct them each time.
{now play the sound}
sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
MS.Free;
end;
end;


das erzeugt eine .wav datei, das ganze müsstest du halt "umdrehen".
weiß leider nichtmehr wo ich das her hatte.

hoffe ich konnte dir helfen :D

_________________
ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home