Simon Online-tutorials.net Administrator
Registriert seit: 01.1970 Wohnort:Dornbirn Beiträge:1181
| Tempest for Eliza Beschreibung
Inhaltsverzeichnis
Hallo,
mich hat das Programm Tempestfor Eliza ziemlich beeindruckt, darum habe ich angefangen eine kleine beschreibung für das Programm zu schreiben (wie es funktioniert).
Da ich im moment wenig Zeit habe werde ich es später verbessern, und irgendwann als Tutorial online stellen.
Wenn jemand lust dazu hat mir zu helfen, kann er sich hier gerne anschließen.
Hier ist die aktuelle Version, eigentlich habe ich nur Quellcodes kommentiert, das ganze ein wenig übersichtlicher meacht, und Variablen geändert.
Später, wenn meine HF Kenntnisse ein wenig besser sind, werde ich mich damit beschäftigen, wie das Signal tatsächlich aussieht. Im moment habe ich keine Ahnung, wie aus der Trägerfrequenz die Töne ausgelesen werden.
Hier die aktuelle Version:
- Die Trägerfrequenz, die der Radio später benutzen wird. [1/s]
double dCarrierFrequency; // Traegerfrequenz
- Auflösung [Pixel]
u_int32_t dScreenWidth; //Auflösung X
u_int32_t dScreenHeight; //Auflösung Y
-
Virtuelle Pixelanzahl (htotal=pixclock/hfreq) (+zusatzinfo, border,...) [Pixel]
u_int32_t dVirtualScreenWidth;
u_int32_t dVirtualScreenHeight;
-
Pixelfrequenz/Pixelclock, wieviel Pixel pro Sekunde dargestellt werden [1/s]
double dPixelClock;
-
Unknown
int playbackmode;
double amplify;
-
ScreenUpdatePixelIncVirt Wieviel Pixel upgedatet werden [Pixel]
double dNumberOfPixelScreenUpdate = dVirtualScreenWidth * dVirtualScreenHeight;
-
Die Zeit für ein Screen Update (inc Virtuellen) [s]
double dTimePerScreenUpdatePeriode = dNumberOfPixelScreenUpdate/dPixelClock;
-
Trägerperioden Pro Screen Update. Anzahl benötigter Traegerperioden pro update periode [1]
double dCarrierPeriodsPerScreenUdtPer=double(intdTimePerScreenUpdatePeriode*dCarrierFrequency));
//Neue Trägerfrequenz als int
dCarrierFrequency = CarrierPeriodsPerScreenUdtPer/dTimePerScreenUpdatePeriode;
- Bytes pro Zeile für das Surface, kann größer als Breite * BytesPerPixel sein, da manche gfx karten 2er potenzen benutzen [Byte]
u_int32_t pitch = screen->pitch;
- Teilt die Anzahl der Pixel Pro Update in 128 Audio sample [Pixel]
//Number of pixels pro screen update periode pro audio sample
double npcb = dNumberOfPixelScreenUpdate/double(128);
Code:
//Geht von oben nach unten durch,danach wird die nächste Spalte genommen, bis zum Ende
for (u_int32_t y=0;y < dScreenHeight;++y)
for (u_int32_t x=0;x < dScreenWidth;++x)
{
double iP= y * dVirtualScreenWidth + x; // pixel index, steigt immer nach rechts, und in der nächsten zeile weiter.
double tP= iP / dPixelClock; // pixel zeit [s] iP/Pixel pro Sekunde -> Zeit wie lange es dauert ip abzulaufen.
//Setzt den Pixel[x,y]
//Setzt das Grundsignal
//Zeit um ip abzulaufen * 1/Trägersign. Zeit * 2PI wenn negativ p um 1 erhöhen
if (sin(tP*dCarrierFrequency*double(2)*M_PI) > 0)
p[pitch*y+x]=int(iP/npcb)*2; //2*128*ip/GesammtPixel
else
p[pitch*y+x]=int(iP/npcb)*2+1;
}
Der Algorithmus als Bild:
Weblinks
Code:
//$1 = frequency
//$2 = mp3 file
//$3 = raw file
//erstellt aus
//Erstellt die wav datei
mpg321 -w delme.wav $2
//Konvertiert zu raw
//-c 1 - 1 Kanal
//-b - Raw file => 8 Bit = 1 Byte
//-u - Raw file encoding = vorzeichenloss linear
//-r - Frequency (sample rate
sox delme.wav -r $1 -t raw -u -b -c 1 $3
Code:
double aF=dPixelClock/npcb; // audio frequenz [1/s]
printf("audio file frequency should be %f Hz\n",aF);
u_int32_t audiolength;
u_int8_t *audiobuf;
//Teilt die Datei in 8Bit blöcke auf, samplelänge
FILE *input;
input = fopen(filename,"rb");
assert (input != NULL);
assert (fseek(input,0,SEEK_END) != -1);
audiolength=ftell(input);
assert (audiolength>=0);
assert (fseek(input,0,SEEK_SET) != -1);
audiobuf = (u_int8_t*) malloc (audiolength);
assert (audiobuf != 0);
assert (fread(audiobuf,audiolength,1,input)==1);
assert (fclose(input)==0);
printf("audiolength is %d\n",audiolength);
Code:
/*
tempest for eliza code
Copyright (C) 2001 Erik Thiele
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
//mpg123 -w out.wav in.mp3 for wav
#include <math.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <SDL.h>
#include <string.h>
#include <assert.h>
//Functions
SDL_Surface *screen;
void error (const char *const msg)
{
fprintf(stderr, "ERROR: %s\n\n", msg);
exit(1);
}
void usage()
{
printf("\nwrong parameters ! read readme file!\n\n");
exit(1);
}
void SDLInit(double dPixelClock, u_int32_t dScreenWidth, u_int32_t dScreenHeight, u_int32_t dVirtualScreenWidth, u_int32_t dVirtualScreenHeight, double dCarrierFrequency, int playbackmode, double amplify)
{
printf("\n"
"Pixel Clock %.5f Hz\n"
"X Resolution %d Pixels\n"
"Y Resolution %d Pixels\n"
"Horizontal Total %d Pixels\n"
"Vertical Total %d Pixels\n"
"AM Carrier Frequency %.5f Hz\n"
"Playbackmode %d\n"
"Amplify %.5f\n"
"\n\n",
dPixelClock,dScreenWidth,dScreenHeight,dVirtualScreenWidth,dVirtualScreenHeight,dCarrierFrequency,playbackmode,amplify);
if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
exit(1);
}
screen = SDL_SetVideoMode(dScreenWidth, dScreenHeight, 8, SDL_HWPALETTE | SDL_ANYFORMAT | SDL_FULLSCREEN);
if ( screen == NULL ) {
fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError());
exit(1);
}
if ((screen->flags | SDL_HWPALETTE) == 0) error("i can't get hardware palette support.");
if ((screen->flags | SDL_FULLSCREEN) == 0) error("cannot set fullscreen mode.");
if (screen->format->BitsPerPixel != 8) error("cannot set 8bpp mode.");
}
//**********************************************************************************
//Main Programm
double dCarrierFrequency; // Traegerfrequenz des Radiosenders [1/s]
u_int32_t dScreenWidth; //Auflösung X
u_int32_t dScreenHeight; //Auflösung Y
//virtueller pixel in X richtung pixclock/hfreq = htotal (+zusatzinfo, border,...)
u_int32_t dVirtualScreenWidth;
u_int32_t dVirtualScreenHeight; //virtueller pixel in X richtung
// Pixelfrequenz der Grafikkarte [1/s], wieviel Pixel pro Sekunde dargestellt werden.
double dPixelClock;
int playbackmode;
double amplify;
int main(int argc, char *argv[])
{
char *filename;
atexit(SDL_Quit);
printf(
"\n"
"Tempest for MP3 - by erikyyy !\n"
"------------------------------\n"
"\n"
"Read the README file to understand what's happening\n"
"if you do not read it, you will NOT know what to do\n"
);
if (argc!=10) usage();
dPixelClock=atof(argv[1]);
dScreenWidth=atol(argv[2]);
dScreenHeight=atol(argv[3]);
dVirtualScreenWidth=atol(argv[4]);
dVirtualScreenHeight=atol(argv[5]);
dCarrierFrequency=atof(argv[6]);
playbackmode=atoi(argv[7]);
amplify=atof(argv[8]);
filename=argv[9];
// number of pixels pro screen update periode
double dNumberOfPixelScreenUpdate = dVirtualScreenWidth * dVirtualScreenHeight;
//gesamtZeit pro screen update periode
double dTimePerScreenUpdatePeriode=dNumberOfPixelScreenUpdate/dPixelClock;
//Anzahl benötigter Traegerperioden pro update periode
double dCarrierPeriodsPerScreenUdtPer=double(intdTimePerScreenUpdatePeriode*dCarrierFrequency));
//Neue Trägerfrequenz als int
dCarrierFrequency = dCarrierPeriodsPerScreenUdtPer/dTimePerScreenUpdatePeriode;
//Initialisiert die SDL
SDLInit(dPixelClock,dScreenWidth,dScreenHeight,dVirtualScreenWidth,
dVirtualScreenHeight,dCarrierFrequency,playbackmode,amplify);
SDL_LockSurface (screen);
//Zugriff auf die Pixel p[x,y]
u_int8_t *p = (u_int8_t*) screen->pixels;
//Wie viel Bytes werden in einer Zeile vom Surface verwendet
//Kann größer als Breite * BytesPerPixel sein, da manche gfx karten 2er potenzen benu.
u_int32_t pitch = screen->pitch;
//Number of pixels pro screen update periode pro audio sample
double npcb = dNumberOfPixelScreenUpdate/double(128);
//Geht von oben nach unten durch
for (u_int32_t y=0;y < dScreenHeight;++y)
for (u_int32_t x=0;x < dScreenWidth;++x)
{
double iP= y * dVirtualScreenWidth + x; // pixel index
double tP= iP / dPixelClock; // pixel zeit [s]
if (sin(tP*dCarrierFrequency*double(2)*M_PI) > 0)
p[pitch*y+x]=int(iP/npcb)*2;
else
p[pitch*y+x]=int(iP/npcb)*2+1;
}
SDL_UnlockSurface(screen);
SDL_Flip(screen);
double aF=dPixelClock/npcb; // audio frequenz [1/s]
printf("audio file frequency should be %f Hz\n",aF);
u_int32_t audiolength;
u_int8_t *audiobuf;
FILE *input;
input = fopen(filename,"rb");
assert (input != NULL);
assert (fseek(input,0,SEEK_END) != -1);
audiolength=ftell(input);
assert (audiolength>=0);
assert (fseek(input,0,SEEK_SET) != -1);
audiobuf = (u_int8_t*) malloc (audiolength);
assert (audiobuf != 0);
assert (fread(audiobuf,audiolength,1,input)==1);
assert (fclose(input)==0);
printf("audiolength is %d\n",audiolength);
SDL_Event event;
Erstellt 256 Farben (8Bit)
SDL_Color colors[256];
//cursorpos der Audio file
u_int32_t curpos=0;
for (; {
//Beenden wenn ein Key gedrückt wird
if(SDL_PollEvent(&event)) if (event.type==SDL_KEYDOWN) exit(0);
//Geht die hälfte der Farben für das Lied durch, die eine hälfte wird Soundvalue, die andere 0, bzw. =255-col bei AM
for(int i=0;i<128;i++){
//Audiobuffer ausrichten
double value=audiobuf[curpos];
//Auf einen Wert zwischen 0 und 255 ausrichten
value-=double(128);
value*=amplify;
value+=double(128);
int ivalue=int(value);
if (ivalue<0) ivalue=0;
if (ivalue>255) ivalue=255;
Kein korrektes AM signal, weniger rauschen
if (playbackmode==0)
{
colors[i*2].r=ivalue;
colors[i*2].g=ivalue;
colors[i*2].b=ivalue;
colors[i*2+1].r=0;
colors[i*2+1].g=0;
colors[i*2+1].b=0;
}
//Erzeugt ein korrektes AM Signal
else if (playbackmode==1) {
int col = (ivalue * 20) / 45;
colors[i*2].r=col;
colors[i*2].g=col;
colors[i*2].b=col;
colors[i*2+1].r=255-col;
colors[i*2+1].g=255-col;
colors[i*2+1].b=255-col;
}
curpos ++;
if (curpos>=audiolength) curpos = 0;//exit(0);
}
SDL_SetPalette(screen, SDL_PHYSPAL, colors, 0, 256);
}
return 0;
}
Dieser Beitrag wurde zuletzt am 27.08.2006 22:33 von Simon editiert. -------------------
http://www.online-tutorials.net/wiki/funktionsname
Für was Personal Firewalls GnuGP emails verschlüsseln C++ Tutorial Sicherheits Tutorials
|