begin process at 2012 02 10 02:54:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Multimédia

 > GÉNÉRATEUR DE SIGNAL BASSE FRÉQUENCE TEMPS RÉEL

GÉNÉRATEUR DE SIGNAL BASSE FRÉQUENCE TEMPS RÉEL


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Multimédia Classé sous :waveoutwrite, waveoutprepareheader, waveoutopen Niveau :Initié Date de création :08/03/2007 Date de mise à jour :08/03/2007 21:42:02 Vu / téléchargé :15 005 / 860

Auteur : gabuzomeuh

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce programme permet la fabrication en continu et en temps réel d'un signal sinusoîdal, 20 Hz à 20kHz. Changement de fréquence appliqué instantanément.

Source

  • #include <windows.h>
  • #include "stdafx.h"
  • #include "resource.h"
  • #include <mmsystem.h>
  • #include <malloc.h>
  • #include <math.h>
  • #include <stdio.h>
  • #define BUFFER_SIZE 4096
  • #define SAMPLERATE 44100
  • #define CANAUX 1 // mono
  • #define OCTETS 2 // 16 bit
  • double pi = 3.1415926535897932;
  • PBYTE Buffer;
  • BOOL flag_out_open = FALSE;
  • //****************************************************************************
  • BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  • {
  • static HWAVEOUT hWaveOut;
  • static PBYTE pBufferOut1, pBufferOut2, pBufferOut3;
  • static PWAVEHDR pWaveHdrOut1, pWaveHdrOut2, pWaveHdrOut3;
  • static WAVEFORMATEX waveform;
  • static long int i;
  • static double j = 0;
  • static float angle;
  • static unsigned char val;
  • static double frequence[19981];
  • static char txt[128];
  • if (msg == WM_INITDIALOG)
  • {
  • for(i=0; i<19981; i++)
  • {
  • sprintf(txt,"%1.1f Hz", 20000.0 - i);
  • frequence[i] = 20000.0 - i;
  • SendDlgItemMessage(hWnd, IDC_COMBO_frequence , CB_ADDSTRING , 0 , (LPARAM)txt);
  • }
  • SendDlgItemMessage(hWnd, IDC_COMBO_frequence, CB_SETCURSEL, 19560, 0);
  • return 0;
  • }
  • if (msg == MM_WOM_OPEN)
  • {
  • flag_out_open = TRUE;
  • waveOutPrepareHeader(hWaveOut, pWaveHdrOut1, sizeof(WAVEHDR));
  • waveOutWrite(hWaveOut, pWaveHdrOut1, sizeof(WAVEHDR));
  • waveOutPrepareHeader(hWaveOut, pWaveHdrOut2, sizeof(WAVEHDR));
  • waveOutWrite(hWaveOut, pWaveHdrOut2, sizeof(WAVEHDR));
  • waveOutPrepareHeader(hWaveOut, pWaveHdrOut3, sizeof(WAVEHDR));
  • waveOutWrite(hWaveOut, pWaveHdrOut3, sizeof(WAVEHDR));
  • return 0;
  • }
  • if (msg == MM_WOM_DONE)
  • {
  • if (OCTETS == 1)
  • {
  • for(i=0; i<BUFFER_SIZE; i++)
  • {
  • angle = 2 * pi * j * frequence[SendDlgItemMessage(hWnd, IDC_COMBO_frequence, CB_GETCURSEL , 0 , 0)] / SAMPLERATE;
  • if (angle > 2 * pi) angle = angle - 2 * pi;
  • val = 127 + 127 * sin(angle);
  • Buffer[i] = (val & 255);
  • j = j + 1;
  • }
  • }
  • if (OCTETS == 2)
  • {
  • for(i=0; i<(BUFFER_SIZE>>1); i++)
  • {
  • angle = 2 * pi * j * frequence[SendDlgItemMessage(hWnd, IDC_COMBO_frequence, CB_GETCURSEL , 0 , 0)] / SAMPLERATE;
  • if (angle > 2 * pi) angle = angle - 2 * pi;
  • val = 32767 * sin(angle);
  • Buffer[ 2*i] = (char)(val & 255);
  • Buffer[1+2*i] = (char)(val >> 8);
  • j = j + 1;
  • }
  • }
  • CopyMemory(((PWAVEHDR)lParam)->lpData, Buffer, BUFFER_SIZE);
  • waveOutPrepareHeader(hWaveOut, ((PWAVEHDR)lParam), sizeof(WAVEHDR));
  • waveOutWrite(hWaveOut, ((PWAVEHDR)lParam), sizeof(WAVEHDR));
  • return 0;
  • }
  • if (msg == WM_COMMAND)
  • {
  • if (wParam == ID_START)
  • {
  • if(flag_out_open == TRUE)
  • {
  • MessageBox(hWnd,"périphérique déjà ouvert","Erreur",0);
  • return 0;
  • }
  • pWaveHdrOut1 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • pWaveHdrOut2 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • pWaveHdrOut3 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • Buffer = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferOut1 = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferOut2 = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferOut3 = (PBYTE)malloc(BUFFER_SIZE);
  • if(!pBufferOut1 || !pBufferOut2 || !pBufferOut3)
  • {
  • if(pBufferOut1) free (pBufferOut1);
  • if(pBufferOut2) free (pBufferOut2);
  • if(pBufferOut3) free (pBufferOut3);
  • MessageBox(hWnd,"Erreur d'allocation de mémoire","Erreur",0);
  • return TRUE;
  • }
  • waveform.nChannels = CANAUX; // 1 pour mono 2 pour stereo
  • waveform.wBitsPerSample = 8 * OCTETS; // 8 ou 16 bit
  • waveform.nAvgBytesPerSec = SAMPLERATE * waveform.nChannels * waveform.wBitsPerSample/8; // nombre d'octets par seconde
  • waveform.wFormatTag = 1; // 1 pour PCM
  • waveform.nSamplesPerSec = SAMPLERATE; // frequence d'echantillonnage
  • waveform.nBlockAlign = 1;
  • waveform.cbSize = 0;
  • if(waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,(DWORD)hWnd,0,CALLBACK_WINDOW))
  • {
  • free(pBufferOut1);
  • free(pBufferOut2);
  • free(pBufferOut3);
  • MessageBox(hWnd,"ouverture du périphérique de sortie impossible","WARNING",MB_OK);
  • return 0;
  • }
  • pWaveHdrOut1->lpData = (LPSTR)pBufferOut1;
  • pWaveHdrOut1->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrOut1->dwBytesRecorded = 0;
  • pWaveHdrOut1->dwUser = 0;
  • pWaveHdrOut1->dwFlags = 0;
  • pWaveHdrOut1->dwLoops = 0;
  • pWaveHdrOut1->lpNext = NULL;
  • pWaveHdrOut1->reserved = 0;
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
  • pWaveHdrOut2->lpData = (LPSTR)pBufferOut2;
  • pWaveHdrOut2->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrOut2->dwBytesRecorded = 0;
  • pWaveHdrOut2->dwUser = 0;
  • pWaveHdrOut2->dwFlags = 0;
  • pWaveHdrOut2->dwLoops = 0;
  • pWaveHdrOut2->lpNext = NULL;
  • pWaveHdrOut2->reserved = 0;
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));
  • pWaveHdrOut3->lpData = (LPSTR)pBufferOut3;
  • pWaveHdrOut3->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrOut3->dwBytesRecorded = 0;
  • pWaveHdrOut3->dwUser = 0;
  • pWaveHdrOut3->dwFlags = 0;
  • pWaveHdrOut3->dwLoops = 0;
  • pWaveHdrOut3->lpNext = NULL;
  • pWaveHdrOut3->reserved = 0;
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));
  • return 0;
  • }
  • if (wParam == IDCANCEL)
  • {
  • if(MessageBox(hWnd, "Voulez-vous vraiment arrêter l'application en cours ?", "Real Time Audio",MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2) == IDNO)
  • {
  • return TRUE;
  • }
  • EndDialog(hWnd, 0);
  • return 0;
  • }
  • }
  • return 0;
  • }
  • //****************************************************************************
  • int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  • {
  • DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),HWND_DESKTOP,DlgProc);
  • return 0;
  • }
  • //****************************************************************************
#include <windows.h>
#include "stdafx.h"
#include "resource.h"
#include <mmsystem.h>
#include <malloc.h>
#include <math.h>
#include <stdio.h>

#define BUFFER_SIZE 4096
#define SAMPLERATE 44100 
#define CANAUX 1 // mono
#define OCTETS 2 // 16 bit

double pi = 3.1415926535897932;

PBYTE Buffer;
BOOL flag_out_open = FALSE;

//****************************************************************************

BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

  static HWAVEOUT hWaveOut;
  static PBYTE pBufferOut1, pBufferOut2, pBufferOut3;
  static PWAVEHDR pWaveHdrOut1, pWaveHdrOut2, pWaveHdrOut3;
  static WAVEFORMATEX waveform;
  static long int i;
  static double j = 0;
  static float angle;
  static unsigned char val;
  static double frequence[19981];
  static char txt[128];

  if (msg == WM_INITDIALOG)
   {
    for(i=0; i<19981; i++)
     {
      sprintf(txt,"%1.1f Hz", 20000.0 - i);
      frequence[i] = 20000.0 - i;
      SendDlgItemMessage(hWnd, IDC_COMBO_frequence , CB_ADDSTRING , 0 , (LPARAM)txt);
     }
    SendDlgItemMessage(hWnd, IDC_COMBO_frequence, CB_SETCURSEL, 19560, 0);
    return 0;
   }



    


  if (msg == MM_WOM_OPEN)
   {
    flag_out_open = TRUE;
    waveOutPrepareHeader(hWaveOut, pWaveHdrOut1, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, pWaveHdrOut1, sizeof(WAVEHDR));
    waveOutPrepareHeader(hWaveOut, pWaveHdrOut2, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, pWaveHdrOut2, sizeof(WAVEHDR));
    waveOutPrepareHeader(hWaveOut, pWaveHdrOut3, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, pWaveHdrOut3, sizeof(WAVEHDR));
    return 0;
   }











  if (msg == MM_WOM_DONE)
   {
    if (OCTETS == 1)
     {
      for(i=0; i<BUFFER_SIZE; i++)
       {
        angle = 2 * pi * j * frequence[SendDlgItemMessage(hWnd, IDC_COMBO_frequence, CB_GETCURSEL , 0 , 0)] / SAMPLERATE;
        if (angle > 2 * pi) angle = angle - 2 * pi;
        val = 127 + 127 * sin(angle);
        Buffer[i] = (val & 255);
        j = j + 1;
       }
     }
    if (OCTETS == 2)
     {
      for(i=0; i<(BUFFER_SIZE>>1); i++)
       {
        angle = 2 * pi * j * frequence[SendDlgItemMessage(hWnd, IDC_COMBO_frequence, CB_GETCURSEL , 0 , 0)] / SAMPLERATE;
        if (angle > 2 * pi) angle = angle - 2 * pi;
        val = 32767 * sin(angle);
        Buffer[  2*i] = (char)(val & 255);
        Buffer[1+2*i] = (char)(val >> 8);
        j = j + 1;
       }
     }
    CopyMemory(((PWAVEHDR)lParam)->lpData, Buffer, BUFFER_SIZE);
    waveOutPrepareHeader(hWaveOut, ((PWAVEHDR)lParam), sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, ((PWAVEHDR)lParam), sizeof(WAVEHDR));
    return 0;
   }








  if (msg == WM_COMMAND)
   {
    if (wParam == ID_START)
     {
      if(flag_out_open == TRUE)
       {
        MessageBox(hWnd,"périphérique déjà ouvert","Erreur",0);
        return 0;
       }     


      pWaveHdrOut1 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      pWaveHdrOut2 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      pWaveHdrOut3 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      
      Buffer      = (PBYTE)malloc(BUFFER_SIZE);
      pBufferOut1 = (PBYTE)malloc(BUFFER_SIZE);
      pBufferOut2 = (PBYTE)malloc(BUFFER_SIZE);
      pBufferOut3 = (PBYTE)malloc(BUFFER_SIZE);
    
      if(!pBufferOut1 || !pBufferOut2 || !pBufferOut3)
       {
        if(pBufferOut1) free (pBufferOut1);
        if(pBufferOut2) free (pBufferOut2);
        if(pBufferOut3) free (pBufferOut3);
        MessageBox(hWnd,"Erreur d'allocation de mémoire","Erreur",0);
        return TRUE;
       }     
    
      waveform.nChannels = CANAUX; // 1 pour mono 2 pour stereo
      waveform.wBitsPerSample = 8 * OCTETS; // 8 ou 16 bit
      waveform.nAvgBytesPerSec = SAMPLERATE * waveform.nChannels * waveform.wBitsPerSample/8; // nombre d'octets par seconde
      waveform.wFormatTag = 1; // 1 pour PCM
      waveform.nSamplesPerSec = SAMPLERATE; // frequence d'echantillonnage
      waveform.nBlockAlign = 1;
      waveform.cbSize = 0;

      if(waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,(DWORD)hWnd,0,CALLBACK_WINDOW))
       {
        free(pBufferOut1);
        free(pBufferOut2);
        free(pBufferOut3);
        MessageBox(hWnd,"ouverture du périphérique de sortie impossible","WARNING",MB_OK);
        return 0;
       }    

      pWaveHdrOut1->lpData = (LPSTR)pBufferOut1;
      pWaveHdrOut1->dwBufferLength = BUFFER_SIZE;
      pWaveHdrOut1->dwBytesRecorded = 0;
      pWaveHdrOut1->dwUser = 0;
      pWaveHdrOut1->dwFlags = 0;
      pWaveHdrOut1->dwLoops = 0;
      pWaveHdrOut1->lpNext = NULL;
      pWaveHdrOut1->reserved = 0;    
      waveOutPrepareHeader(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
    
      pWaveHdrOut2->lpData = (LPSTR)pBufferOut2;
      pWaveHdrOut2->dwBufferLength = BUFFER_SIZE;
      pWaveHdrOut2->dwBytesRecorded = 0;
      pWaveHdrOut2->dwUser = 0;
      pWaveHdrOut2->dwFlags = 0;
      pWaveHdrOut2->dwLoops = 0;
      pWaveHdrOut2->lpNext = NULL;
      pWaveHdrOut2->reserved = 0;    
      waveOutPrepareHeader(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));

      pWaveHdrOut3->lpData = (LPSTR)pBufferOut3;
      pWaveHdrOut3->dwBufferLength = BUFFER_SIZE;
      pWaveHdrOut3->dwBytesRecorded = 0;
      pWaveHdrOut3->dwUser = 0;
      pWaveHdrOut3->dwFlags = 0;
      pWaveHdrOut3->dwLoops = 0;
      pWaveHdrOut3->lpNext = NULL;
      pWaveHdrOut3->reserved = 0;    
      waveOutPrepareHeader(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));

      return 0;
     }

    if (wParam == IDCANCEL)
     {
      if(MessageBox(hWnd, "Voulez-vous vraiment arrêter l'application en cours ?", "Real Time Audio",MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2) == IDNO)
       {
        return TRUE;
       }
      EndDialog(hWnd, 0);
      return 0;
     }
   }



  return 0;
}

//****************************************************************************
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),HWND_DESKTOP,DlgProc);
  return 0;
}

//****************************************************************************


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

08 mars 2007 21:42:02 :
ajout du format 16 bit

 Sources du même auteur

Source avec Zip Source avec une capture MOTEUR AUDIO TEMPS REEL AVEC GESTION DU VOLUME
Source avec Zip Source avec une capture PLUGIN ECHO POUR WINAMP
MODIFIER LA HAUTEUR DE LA BARRE DE TACHES
Source avec Zip Source avec une capture GÉNÉRATEUR DE FICHIER WAV DE RÉFÉRENCE POUR CD DE TEST
Source avec Zip ICONE DANS BARRE DE TACHES AVEC GESTION DOUBLE CLIC DROIT OU...

 Sources de la même categorie

Source avec Zip ADAPTER LES TEMPS DE SUBTITLES DE SOUS TITRAGE ENTRE DEUX LA... par berrami
Source avec Zip Source avec une capture DÉTECTION DE VISAGE (YEUX, NEZ, BOUCHE) AVEC OPENCV EN TEMPS... par MadM@tt
Source avec Zip Source avec une capture GÉNÉRATEUR FM EXPÉRIMENTAL par tontonCD
Source avec Zip LECTEUR MULTIMÉDIA par omegatou
Source avec Zip IMPLÉMENTATION D'UN ALGORITHME DE COMPRESSION/DECOMPRESSION ... par eemikhm

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [WIN32] EASY WAVE MIXER par ordiman85
Source avec Zip Source avec une capture MOTEUR AUDIO TEMPS REEL par gabuzomeuh

Commentaires et avis

Commentaire de acx01b le 08/03/2007 21:07:41

salut,

il est plus intéressant au niveau performance je pense de calculer les points de la sinusoïde à l'aide des complexes
(a+ib)(c+id) = (ac-bd) + i(ad+bc)

double angle = 2*M_PI/n;

double a = cos(angle);
double b = sin(angle);
double c = 1;
double d[4*n];

int i;
tab[0] = 0;
for (i=1; i < 2*n; i++) {
  tmp = a*c-b*d[2*i-2];
  tab[2*i] = a*d[2*i-2]+b*c;
}

dans le tableau c tu as alors toute ta période

a+

Commentaire de acx01b le 08/03/2007 21:08:42

dans le tableau d pardon

Commentaire de acx01b le 08/03/2007 21:10:52

troisième essai...


double angle = 2*M_PI/n;

double a = cos(angle);
double b = sin(angle);
double c = 1;
double d[2*n];

int i;
tab[0] = 0;
for (i=0; i < 2*n-1; i++) {
  c = a*c-b*d[i];
  d[i+1] = a*d[i]+b*c;
}

dans le tableau d tu as alors toute ta période

Commentaire de gabuzomeuh le 08/03/2007 22:09:20

Quand la fenêtre est réduite ou restaurée, il y a une courte interruption du processus.
Doit-on utiliser un thread ou un SetPriorityClass ou un EnterCriticalSection ?


Commentaire de Taron31 le 09/03/2007 13:12:38

si tu veux être encore plus performant, tu peux coder en asm inline avec la FPU les calculs des flottants...

Commentaire de max12 le 09/03/2007 16:25:23 administrateur CS

EnterCriticalSection sert à faire de la synchronisation de thread donc à bloquer ceux-ci tant que la section n'est pas libéré donc sa n'a rien à voir :P Il faut utiliser SetThreadPriority dans ce cas :)

Commentaire de arb le 11/04/2007 01:36:39

Super et très intéressant : le hic : je n'ai pas VCC. Puis je porter tout ça sous DEVCPP sans trop d'encombre ou un autre?
Merci de votre aide.

Commentaire de jacquesleps le 25/03/2008 20:14:05

je présume que tu veux dire:

int i;
d[0] = 0; // et pas tab
for (i=0; i < 2*n-1; i++) {
  c = a*c-b*d[i];
  d[i+1] = a*d[i]+b*c;
}

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,477 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales