<< Hangmintakészítő algoritmus Vissza a HF generátor hangkártyából oldalra
Hangmintakészítő program
A hangmintafájlokat előállító program a *.wav fájlok formátumleírása és az előző oldal algoritmusa alapján könnyen elkészíthető.
A következőkben ennek megvalósítása látható Turbo Pascal programozási nyelven. A letölthető programlisták az 1990-es kiadású Borland Turbo Pascal 6.0 programmal készültek.
A programfej és a deklarációs rész a szükséges változókkal:
program cdgen; const lepeskoz: real=1/44100; var frekvencia: word; periodusido,meret,valodi_frekvencia,valodi_hossz: real; lepesszam,ertek,teljeshossz,adatszam: longint; mintaszam,szamlalo,hullamszam,temp: longint; fajlnev: string[8]; hossz: byte; fajl: file of longint; |
Mivel a hangmintafájlt négybájtos szavanként (longint) kezeljük, szükség van még egy összefűző függvényre, amely 4db egybájtos adatból egyetlen négybájtosat készít. A következő függvény az a, b, c, d bemenő egybájtos adatokat felfűzi egy d - c - b - a sorrendű négybájtos dupla szóvá, amely a little endian tárolási mód miatt majd újra a helyes sorrendben (a - b - c - d) fog tárolódni a fájlban.
function konverzio(a,b,c,d):longint; begin temp:=d; temp:=(temp shl 8); temp:=temp+c; temp:=(temp shl 8); temp:=temp+b; temp:=(temp shl 8); temp:=temp+a; konverzio:=temp; end; |
A program végrehajtó része az adatbevitellel kezdődik:
begin write('A létrehozandó hangfájl neve:'); readln(fajlnev); write('A frekvencia [Hz]:'); readln(frekvencia); write('Az időtartam [s]:'); readln(hossz); |
A szükséges segédadatok számítása:
periodusido:=1/frekvencia; hullamszam:=round(hossz/periodusido); mintaszam:=round((hullamszam*periodusido)/lepeskoz); adatszam:=(mintaszam*4)+8; teljeshossz:=adatszam+36; valodi_hossz:=lepeskoz*mintaszam; valodi_frekvencia:=hullamszam/valodi_hossz; valodi_hossz:=valodi_hossz+(lepeskoz*2); meret:=(teljeshossz+8)/1024/1024; |
A hangmintafájl első konstans adatainak beírása:
assign(fajl,fajlnev+'.wav'); rewrite(fajl); temp:=konverzio(82,73,70,70); write(fajl,temp); temp:=teljeshossz; write(fajl,temp); temp:=konverzio(87,65,86,69); write(fajl,temp); temp:=konverzio(102,109,116,32); write(fajl,temp); temp:=konverzio(16,0,0,0); write(fajl,temp); temp:=konverzio(1,0,2,0); write(fajl,temp); temp:=konverzio(68,172,0,0); write(fajl,temp); temp:=konverzio(16,177,2,0); write(fajl,temp); temp:=konverzio(4,0,16,0); write(fajl,temp); temp:=konverzio(100,97,116,97); write(fajl,temp); temp:=adatszam; write(fajl,temp); temp:=konverzio(0,0,0,0); write(fajl,temp); |
Ezután következik a hangminták értékeinek számítása. Mivel mindkét hangcsatornában ugyanazt a hangjelet kell szerepeltetni, a számított kétbájtos értékeket egy eltolással meg kell duplázni négybájtossá. A hangmintafájl számított szinuszos értékei:
szamlalo:=1; repeat ertek:=round(32766*sin(szamlalo*lepeskoz*2*pi/periodusido)); ertek:=ertek*65536+ertek; szamlalo:=szamlalo+1; until (szamlalo*4)>(adatszam-7); |
A befejező nulla jel beírása és a fájl bezárása:
temp:=konverzio(0,0,0,0); write(fajl,temp); close(fajl); |
A számított adatok kiírása, majd a program vége:
writeln('A hangfájl frekvenciája: ',valodi_frekvencia,' Hz'); writeln('A hangfájl időtartama: ',valodi_hossz,' s'); writeln('A hangfájl mérete: ',meret,' MB'); end. |
A fenti programlista menürendszerrel és írási állapot kijelzősávval bővítve letölthető a cdgen11.pas helyről, a program kerekített hullámhosszú változata pedig a cdgen10.pas helyről.
Ezzel a módszerrel a két csatorna eltérő fázishelyzetű és eltérő frekvenciájú hangjelekkel is feltölthető az értékszámító rész átírásával.
Tudomány és Technika (test@t-es-t.hu)
<< Hangmintakészítő algoritmus Vissza a HF generátor hangkártyából oldalra