Захват звука с микрофона - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Подскажите пожалуйста с помощью каких библиотек и каких их функций можно захватить звук с микрофона. Нужен массив звуковых значений для последующей реализации над ним Быстрого преобразования Фурье. Помогите бедному студенту

Решение задачи: «Захват звука с микрофона»

textual
Листинг программы
#include <fmx.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "mmsystem.h"
#include "math.h"
#include "Mmreg.h"
#include "Windows.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
 
const maxbuf=44100*20;
THandle hDevice;
HWAVEOUT hDevice1;
char buf[maxbuf-1];
 
int razmerBuf=0;
 
//------------------------------------------------------------
 int TForm1::CalcCycles(){
    const epsilon=0.01;
    double f,n,dn;
    int ni;
    f=10000;//f=GetValue;
    n=44100/f; dn=n;
    ni=1;
    while ((abs(ceil(n)-n)>epsilon) && (ni<100)) {
      ni++;
      n=n+dn;
    }
    return ceil(n);
  }
//------------------------------------------------------------
void TForm1::ProgramDevice(){
 // const hdr:TWaveHdr=();
  WAVEHDR hdr;
  int  i,err;
  double v;
 
 
  err=waveOutReset(hDevice1);
  hdr.lpData=buf;
  hdr.dwBufferLength=CalcCycles()*2;
  hdr.dwFlags=WHDR_BEGINLOOP || WHDR_ENDLOOP;
  hdr.dwLoops=100000000;
 
 
 // v=2*PI*GetValue/44100;
 v=2*3.14*10/44100;
  razmerBuf =hdr.dwBufferLength/2;
//  for (int i=0; i<hdr.dwBufferLength/2;i++)
//  buf[i]=ceil(32700*sin(i*v));
 for (int i=0; i<hdr.dwBufferLength/2;i++)
   buf[i]=1;
 
  err=waveOutPrepareHeader(hDevice1,&hdr,sizeof(hdr));
  err=waveOutWrite(hDevice1,&hdr,sizeof(hdr));
  }
//------------------------------------------------------------
void TForm1::ShowSignal(){
    Chart1->Series[0]->Clear();
  for (int i=0; i<razmerBuf;i++)
    Chart1->Series[0]->AddY(buf[i]);
 
}
//------------------------------------------------------------
 
void TForm1::start(){
//TWaveFormatEx wfe;
WAVEFORMATEX wfe;
int  err;
 
wfe.wFormatTag=WAVE_FORMAT_PCM;
wfe.nChannels=1;
wfe.nSamplesPerSec=44100;
wfe.nBlockAlign=2;
wfe.wBitsPerSample=16;
wfe.nAvgBytesPerSec=wfe.nSamplesPerSec*wfe.nBlockAlign;
wfe.cbSize=0;
 
//LPHWAVEOUT
err=waveOutOpen(&hDevice1,WAVE_MAPPER,&wfe,(DWORD)Form1->Handle,0,CALLBACK_WINDOW);
 
 
if (err != MMSYSERR_NOERROR){
ShowMessage("Не могу открыть аудиоустройство!");
exit(0);
}
// while(Form1->btnStart->Text!="Стоп")
 
 
 
}
 
//------------------------------------------------------------
 
void TForm1::stop(){
  waveOutReset(hDevice1);
  waveOutClose(hDevice1);
}
 
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStartClick(TObject *Sender)
{
 if (btnStart->Text=="Старт"){
 start();
 btnStart->Text="Стоп";
 Timer1->Enabled =true;
 }
 else {
 stop();
 btnStart->Text="Старт";
 Timer1->Enabled =false;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
cbSignalType->Items->Add("1. Синусоидальный");
cbSignalType->Items->Add("2. Прямоугольный");
cbSignalType->Items->Add("3. Пилообразный");
cbSignalType->Items->Add("4. Прямая линия");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  ProgramDevice();
  ShowSignal();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
stop();
}

Объяснение кода листинга программы

  1. В этом коде реализуется функция захвата звука с микрофона и отображения его в виде графика.
  2. Переменная maxbuf содержит максимальную длину буфера в сэмплах.
  3. Переменная hDevice используется для хранения дескриптора устройства захвата звука.
  4. Переменная hDevice1 используется для хранения дескриптора устройства вывода звука.
  5. Переменная buf используется для хранения сэмплов звука.
  6. Переменная razmerBuf используется для хранения количества сэмплов в буфере.
  7. Функция CalcCycles используется для вычисления оптимального количества циклов в буфере.
  8. Функция ProgramDevice используется для подготовки и записи данных в буфер устройства вывода звука.
  9. Функция ShowSignal используется для отображения данных из буфера в виде графика.
  10. Функция start используется для инициализации устройства захвата звука и начала записи данных.
  11. Функция stop используется для остановки записи данных и освобождения ресурсов устройства захвата звука.
  12. В обработчике события btnStartClick происходит переключение между режимами записи и воспроизведения звука.
  13. В обработчике события FormCreate добавляются опции типа сигнала в список выбора.
  14. В обработчике события Timer1Timer выполняется программа устройства и отображение сигнала.
  15. В обработчике события FormClose выполняется остановка записи данных и освобождение ресурсов устройства захвата звука.
  16. Переменная epsilon используется для определения точности вычислений в функции CalcCycles.
  17. Переменная f используется для хранения частоты дискретизации в функции CalcCycles.
  18. Переменная n используется для хранения количества циклов в буфере в функции CalcCycles.
  19. Переменная dn используется для хранения шага изменения количества циклов в функции CalcCycles.
  20. Переменная ni используется для хранения номера итерации в цикле поиска оптимального количества циклов в функции CalcCycles.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5