Forum: Mikrocontroller und Digitale Elektronik Signal über Soundkarte generieren


von Koly (Gast)


Lesenswert?

Hallo Zusammen,

ich habe hier ein Problem und brauche drigend eine Hilfe.
ich versuche ein Sinussignal über Soundkarte zu generieren.die Sample 
bei Soundkarte darf entweder 8 oder 16 bits sein, daher habe ich die 
Werte als ganz Zahl berechnet und dann von jede Sample  die erste und 
die zweite Byte kopiert in char Buffer wenn es die Wert 16 bits ist. bei 
8 Bits wird nur die erst byte kopiert.

Bei Verwendung von 8 bits für die Sample  bekomme  ich  ein sauberes 
Sinussignal über die Soundkarte und auch im Osziloskop aber wenn ich 16 
Bits verwende bekomme ich eine Kommisches Signal.
hier ist eine Abschnitt meine C++ Code:
1
     int  values;
2
     int* pvalues;
3
     char  byte  = 0;
4
     char* pByte = 0;
5
     char  low_part;
6
     char  high_part;
7
     int   fs=44100;                    
8
     double T =0.008;
9
     int    anzahl= (int)fs*T;                                              //Anzahl der Samples
10
    int    sampleBits,i;                                // jede Sample bei Soundkarte darf entweder 8 oder 16 Bits größ sein
11
        
12
    std::vector<char> charBuf;  
13
    
14
    std::cout<<"Geben Sie die Anzahl der Bits von jeder Sample"<<std::endl;
15
    std::cin >> sampleBits;                                //die Größe der Sample 8 oder 16 Bits 
16
         
17
    for(i=0; i< anzahl; i++)
18
      {
19
                                                //die Wert der Sample ersmal als intger brechnen
20
            values=(int)floor( (pow(2,sampleBits)-1)*sin(T*i/anzahl) );
21
22
            pvalues= &values ;
23
            pByte = reinterpret_cast<char*>(pvalues);                      // einen char pointer auf den int pointer zeigen lassen
24
                    
25
            if(sampleBits == 8)                                          // Sample 8 Bits Größe
26
              {
27
                  charBuf.push_back(*pByte);                            // erste Byte von der integer Wert in Buffer kopieren
28
                    
29
               }
30
            if(sampleBits == 16)                                         // Sample 16 Bits Größe
31
              {
32
                low_part=(*pByte);                                      //die ereste Byte der intger- Samples von Recht gezählt
33
                high_part=*(pByte+1);                                   // die zweite Byte der integer-Sample von Recht gezäht
34
               
35
               charBuf.push_back(low_part);                     // kopieren der int Sample in Buffer der Karte                                          
36
                                                  
37
                charBuf.push_back(high_part);  
38
             }
39
     }
40
41
             status = write(fd_,&(charBuf[0]), charBuf.size());                            // signalwerte auf Soundkarte schreiben
weis jemand wie die Daten in Buffer der SoundKarte geschrieben werden 
soll?
ich hoffe  dass, da jemend der mir weiterhelfen kann.

Danke schön mal im Voraus

von Martin S. (sirnails)


Lesenswert?

Welches Betriebssystem?

von Koly (Gast)


Lesenswert?

sorry , bertriebsystem ist Linux(debian).

von tipomatic (Gast)


Lesenswert?

multiplatform:
http://www.portaudio.com/

von Georg aus Wien (Gast)


Lesenswert?

Schau mal, ob du ein /dev/dsp oder /dev/audio Device hast. Da kannst du 
dann deine Daten einfach wie in ne Datei reinschieben. Ob da vorher noch 
n Header dran sein muss, weiß ich nicht; aber probieren geht ja 
bekanntlich über studieren :)

von Koly (Gast)


Lesenswert?

Das genau was ich  gemacht habe,aber wir gesagt es  hat nur bei 8 Bit 
funktioniert.
das Code kann ich nicht komplet posten,da es zu größe ist.
1
int fd_;                             /* device file descriptor */
2
std::vector<char> charBuf; ;         /* buffer to hold data *
3
4
int status;
5
                                    /* open device */
6
             status = fd_ = open("/dev/dsp", O_RDWR);
7
    if (status == -1) 
8
              {
9
                perror("error opening /dev/dsp");
10
                }
11
        status = write(fd_,&(charBuf[0]), charBuf.size());                            // signalwerte auf Soundkarte schreiben
12
                           
13
    if (status == -1) 
14
      {
15
    perror("loop:error writing to /dev/dsp");
16
      }

von Jim M. (turboj)


Lesenswert?

Bei Audio sind die 8-Bit Formate unsigned, während die 16 Bit Formate 
meistens signed sind. Du musst für die 16 Bit also 32768 abziehen.

Ich sehe auch nirgendwo den Code, der /dev/dsp mitteilt dass nun 16 Bit 
Daten folgen. Dieses device erwartet per default 8 Bit unsigned mono 
Daten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.