6.3. Az impulzusválasz teszt kódja
A rendszer felépítésének ismertetése már megtörtént, s láthattuk, hogy milyen programozási eszközök vannak a kezünkben ahhoz, hogy megvalósítsuk az általunk kitűzött célokat. Tudunk hangfelvételt készíteni a Sound Blaster segítségével és képesek vagyunk hangot megszólaltatni a Gravis Ultrasound ACE hangkártyával. Ezek után tekintsük át az impulzusválasz tesztet megvalósító program kódját.
uses crt, sb16mix, sb_aidma, gus;{ A szükséges unitok }
var filehandle: file;
filename: string;
rec,w,r,rs:word;
Procedure SetSBMixer; { A Sound Blaster mixerének beállítása }
begin
SetMasterVolume($ff,$ff); { Bemeneti eszközök hangereje maximumon}
SetDSPVolume($ff,$ff); { DSP hangereje maximumon }
SetMicVolume($ff); { Mikrofon hangereje maximumon }
SetLineVolume($ff,$ff); { Vonali bemenet hangereje maximumon }
OutputSelect($00); { Nincs eszköz a kimeneten }
InputSelect($01,$01); { Csak a mikrofonról van bemenet: $01}
MicAGC(off); { AGC lekapcsolva }
SetRecordSampleRate(44100); { Beállítjuk a mintavételi frekvenciát }
end;
Procedure GravisSign; { Hangminta generálása Gravis Ultrasound-dal }
var i,y:longint;
begin
GravisReset; { A hangkártya alapállapotba hozása }
{ Egyetlen hangminta széles impulzus betöltése a GUS DRAM-ba }
for i:=0 to 0 do
PutByte(i,127);
for i:=1 to 65535 do
PutByte(i,0);
Volume($00,64); { Hangerő közvetlen beállítása}
Note($00,36); { A csatornához tartozó frekvencia beállítása }
GravisBalance($00,$08); { Egy csatorna balanszértékének beállítása }
SetGF1Byte($00,$4c,$03); { Inicializálás }
PlayVoice($00,$08,0,0,524288); { A hangminta lejátszása }
end;
BEGIN
clrscr;
if AllocDMAbuffer(16384)<0 then{ Helyfoglalás a DMA buffer részére}
begin
writeln(‘Failed to allocate DMA buffer!’);
halt;
end;
SetSBMixer;
InitInterrupt(nil); { Beállítjuk a megszakításvezérlőt }
SetDMAblockSize(8192); { Beállítjuk a DSP blokkméretét }
InitDMAcontroller(RecordMode);{ Inicializáljuk a DMA vezérlőt (REC)}
{ A felvétel mentési útvonalát várja paraméterként a parancssorba }
Writeln(‘Recording, press any key to stop…’);
if paramcount=0 then
begin
writeln;
writeln(‘Usage: REC1 <path>’);
delay(5000);
exit;
end;
filename:=paramstr(1);
assign(filehandle,filename);
rewrite(filehandle,1); { Megnyitjuk a hangmitna fájlt írásra }
rs:=Halfsize;
GravisSign; { Impulzus generálásának elindítása }
StartAutoInitDMArecord; { Elindítjuk a felvételt }
rec:=0;
repeat
if RfshRequest then { Ha a fél buffert feltöltötte… }
begin
inc(rec);
RfshRequest:=false; { RfshRequest= FALSE ! }
{ Kiírjuk a blokkot a HDD-re }
blockwrite(filehandle,DMAptr^,HalfSize,rs);
write(‘*’);
NextBuffer; { A következő félbufferre váltunk }
end;
until rec=8; { Kilépünk, 65536 minta felvétele után }
close(filehandle); { Lezárjuk a fájlt }
writeln;
StopAutoInitDMA; { Leállítjuk a DMA átvitelt }
DoneDMAcontroller; { Tiltjuk a DMA csatornát }
DoneInterrupt; { Visszaállítjuk a megszakítást }
FreeDMAbuffer; { Felszabadítjuk a DMA buffert }
StopVoice($00); { Gravis elhallgat }
readln;
END.
A teszt eredménye egy hangállomány, amely visszajátszható a mellékelt Play program segítségével, és hullámformája megtekinthető a Scroll nevű programmal. (A Play program listája a F.29-ben tanulmányozható, a Scroll pedig a F.30-ban.) Az időfüggvény sok mindent elárul az adott terem hangzásáról. Példaként már említettük, hogy segítségével igen pontosan meg lehet határozni a visszhangok helyét, illetve el lehet választani a közvetlenül a hangforrásból származó hangokat és az egyéb visszaverődéseket. Illusztrációként nézzük meg egy ilyen impulzusválasz időfüggvényének részletét. (Lásd F.17.)
F.17. Az impulzusválasz időfüggvénye. Az ábra alapján kiszámolható, hogy a mikrofon a hangforrástól 136 cm-re volt. 0,5 ms-ra volt szüksége az impulzusnak ahhoz, hogy a hangszórón megjelenjen, és 4 ms telt el, míg az első hanghullámok eljutottak a hangforrástól a mikrofonig.
Hozzászóláshoz be kell jelentkezni!