wav-file erstellen



  • Guten abend!

    Habe folgenden Code um ein wav-file zu erstellen:

    #include <stdio.h>
    #include <windows.h>
    #include <math.h>
    #include <iostream.h>
    #define M_PI 3.141592654

    const int SAMPLESIZE = 36000;
    const int FAKTOR=200;
    void main(void)
    {

    // Die Wavedatei

    char ID[4];
    int ChunkSize;
    char Format[4];
    char Subchunk1ID[4];
    int Subchunk1Size;
    WORD AudioFormat;
    WORD NumChannels;
    int SampleRate;
    int ByteRate;
    WORD BlockAlign;
    WORD BitsPerSample;
    char Subchunk2ID[4];
    int Subchunk2Size;
    short Data[SAMPLESIZE];

    printf("Hallo 1");

    /// Variablen mit Daten fuellen

    ID[0] = 'R';
    ID[1] = 'I';
    ID[2] = 'F';
    ID[3] = 'F';

    ChunkSize = FAKTOR*(36 /*groeße des wave headers*/ + SAMPLESIZE*2/*sampledaten*/);

    Format[0] = 'W';
    Format[1] = 'A';
    Format[2] = 'V';
    Format[3] = 'E';

    Subchunk1ID[0] = 'f';
    Subchunk1ID[1] = 'm';
    Subchunk1ID[2] = 't';
    Subchunk1ID[3] = ' ';

    Subchunk1Size = 16;
    AudioFormat = 1; // PCM
    NumChannels = 1; // MONO
    SampleRate = 44100;
    ByteRate = 44100*2;
    BlockAlign = 2;
    BitsPerSample = 16;

    printf("Hallo 2");

    Subchunk2ID[0] = 'd';
    Subchunk2ID[1] = 'a';
    Subchunk2ID[2] = 't';
    Subchunk2ID[3] = 'a';
    Subchunk2Size = FAKTOR*(SAMPLESIZE*2);

    for(int x = 0; x<SAMPLESIZE; x++)
    {


    printf("%d\n",Data[x]);
    }

    printf("Hallo 4");

    // WaveDatei speichern

    FILE file = NULL;
    file = fopen("sine.wav", "wb");
    fwrite(&ID, 4
    sizeof(char), 1, file);
    fwrite(&ChunkSize, sizeof(int), 1, file);
    fwrite(&Format, 4sizeof(char), 1, file);
    fwrite(&Subchunk1ID, 4
    sizeof(char), 1, file);
    fwrite(&Subchunk1Size, sizeof(int), 1, file);
    fwrite(&AudioFormat, sizeof(AudioFormat), 1, file);
    fwrite(&NumChannels, sizeof(NumChannels), 1, file);
    fwrite(&SampleRate, sizeof(int), 1, file);
    fwrite(&ByteRate, sizeof(int), 1, file);
    fwrite(&BlockAlign, sizeof(WORD), 1, file);
    fwrite(&BitsPerSample, sizeof(WORD), 1, file);
    fwrite(&Subchunk2ID, 4*sizeof(char), 1, file);
    fwrite(&Subchunk2Size, sizeof(int), 1, file);

    for (int i=0;i<2FAKTOR;i++)
    {
    fwrite(&Data, 2
    SAMPLESIZE, 1, file);
    }

    fclose(file);

    }

    Meine Frage:

    In der for-Schleife:
    for(int x = 0; x<SAMPLESIZE; x++)
    {


    printf("%d\n",Data[x]);
    }

    Moechte ich gerne die Amplitude bzw. die Frequenz dieser Sinus Schwingung festlegen!
    Kann mir da jemand mit dem einbinden der Formeln helfen???

    Amplitudenmodulation:
    http://de.wikipedia.org/wiki/Amplitudenmodulation

    Frequenzmodulation:
    http://de.wikipedia.org/wiki/Frequenzmodulation

    MfG

    Spanockel



  • mmh, komm da jetzt noch net so mit was du willst, und warum postest du links zu fm und am??

    du willst die amplitude und frequenz der schwingung festlegen?? amlitude legst du fest mit 30000 bei dir.Und frequenz ist perioden pro secunde, so kommt dann noch die samplefrequenz fs, mit ins spiel, fs gibt die punkte pro sekunde an.

    F die freguenz die du haben willst, f/fs gibt dir wieviel punkte du fuer eine schwingungsperiode hast. 2PI/(fs/f) gibts dir das inkrement im sin fuer die Frequenz. Also fuer x=0,1,3..... Amplitude * sin( X * 2PI * Frequenz/ Samplefrequenz) ist deine Schwinung.
    Ich tendier meist inherhalb des Programms die frequenz immer in f/fs anzugeben, da man so soweit wie moeglich unabhaenig von der samplefrequenz arbeiten kann.

    So, ich hoffe das hilft etwas, oder wolltest du was ganz anderes?



  • Hallo!

    Danke fuer die Muehe!

    In der Schleife:
    for(int x = 0; x<SAMPLESIZE; x++)
    {


    printf("%d\n",Data[x]);
    }

    ->Was bedeutet das 180.0f ??

    Ich haette da noch eine Bitte!
    Kannst du mir ein Beispiel bzw eine Formel fuer eine AM bzw FM nennen?

    Vielen Dank im vorraus!

    MfG

    Spanockel



  • Was das beudeutet, 180.0 is ne nummer und f steht fuer float constant?? Was ist unklar. Heisst in dem fall 180 punkte pro halbwelle, da aber hinten noch mal 4 - also 45 punkte, das heisst bei 44100 fs sind das 44100/45 hz was du hoerst.

    AM und FM

    AM:

    normale formel:
    Amplitude * ( 1 + Modulationsindex * sin(ModulationsFrequenz * t))* Sin(traegerfrequenz * t).

    Der Modulations index ist der grad der Modulation (spielt mit rum und lass nen graph zeichnen.) Wenn groesser als 1, dann gibts phasenspruenge im traeger. (normal 0.5-0.75 fuer technische anwendungen, grob gesagt)

    Das f*t jeweils in x*2_pi*f/fs umbasteln damit es quasi diskret geht.
    Genauso auch bei fm:

    Formel FM:
    Amplitude * Sin( TraegerFrequenz * t * Frequenzhub * sin(ModulationsFrequenz *t))

    Der Hub sagt aus in welchem Frequenzbereich der Traeger morduliert wird.

    Der hub beiflusst massiv das Spektrum der FM (-> besselfunktionen),

    Generell, wenn du das zur sound creation nimmts kann man die Waveform - hier sin - auch mit Rechteck, Saegzahn, dreick etc ... ersetzten, das gilt fuer traeger als auch fuer Modulator.

    Gruss
    Flow

    Ps: der gepostete Code ist kein C++, sollte eigentlich ins c forum, was du hier machst.



  • Hallo, sorry dass ich das alte Thema wieder rauskrame aber ich verstehe nicht was das t in der FM-Formel darstellt?

    Formel FM:
    Amplitude * Sin( TraegerFrequenz * t * Frequenzhub * sin(ModulationsFrequenz *t))

    Was muss ich für t einsetzen damits funktioniert?



  • Hallo

    Flow_cplus schrieb:

    Formel FM:
    Amplitude * Sin( TraegerFrequenz * t * Frequenzhub * sin(ModulationsFrequenz *t))

    Ich meine in die Formel hat sich ein Fehler eingeschlichen. Richtig heisst es:
    Amplitude * sin( (TraegerFrequenz * t) + (Frequenzhub * sin(ModulationsFrequenz *t)))

    Gruß



  • Aha, und wofür steht nun das t ??



  • sine22 schrieb:

    Aha, und wofür steht nun das t ??

    t = time = Zeit?


Anmelden zum Antworten