Tempest for Eliza Beschreibung

Online-tutorials.net Forenübersicht/Projekte/Tempest for Eliza Beschreibung

Antworten Neues Thema Bottom Seite 1 

Autor | Nachricht      nächster / vorheriger Thread

Simon
Online-tutorials.net Administrator

avatar

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:

Variablen Top



  • 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);



Setzen der Pixel Top



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:

Abbildung



mksong.sh Top



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



Audio file laden Top



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 Top



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;
}



Weblinks Top



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



07.09.2005 16:33Homepage >> icq status >>Profil >> Zitat >> IP gespeichert 
Keywords:Tempest for Eliza
                   nächster / vorheriger Thread

Antworten Neues Thema Top Seite 1