Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Генерация сигналов на звуковой карте  (Прочитано 12815 раз)
0 Пользователей и 1 Гость смотрят эту тему.
rainbowhope
Гость
« : 13-03-2009 06:06 » 

Приветствую Вас!
Очень прошу помочь советом!
Задача такая:
Нужно создать на языке Си генератор сигналов на звуковой карте, причем форма сигнала должна задаваться формулой ,а не проигрыванием файла, как wav. Наколько я понмаю, существует библиотека DirectSound, которая дает доступ к ресурсам платы через HAL, но она заточена именно на работу с файловыми потоками. Прошу помочь примером, рекомендацией книги или ссылкой на ресурс.
Заранее спасибо.
михаил.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-03-2009 06:36 » 

rainbowhope, теорию почитать не вредно...
http://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%D0%BD%D0%BE-%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F

Дело не хитрое:

1. По формуле вычисляешь дискретные значения сигнала для данной частоты дискретизации и записываешь их в буфер.
2. Буфер передаешь на воспроизведение в аудиокарту.

В условиях винды надо будет еще почитать про DirectSound.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
sss
Специалист

ru
Offline Offline

« Ответ #2 : 13-03-2009 06:42 » 

rainbowhope, в формате wav лежит частотная информация в цифровом виде. Ты можешь заполнить wav по формуле и проигрывать. Возможно тебе надо покопать в сторону "Waveform Audio Reference" в MSDN
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #3 : 13-03-2009 06:53 » 

Во, нашел в MSDN. Хватит такого частотного диапазона?
Код:
#define DEFINE_GUIDS 1
#include "windows.h"
#include "stdio.h"
#include "wfmtmidi.h"

/*
DTMF frequencies:
DTMF stands for Dual Tone Multi Frequency. These are the tones used
for key presees on a telephone touchpad. The tone of the button is the
sum of the column and row tones. The ABCD keys do not exist on standard
telephones.

                         Frequency 1
                    1209  1336  1477  1633
                  ------------------------
              697 |   1     2     3     A
              770 |   4     5     6     B
Frequency 2   852 |   7     8     9     C
              941 |   *     0     #     D

  Frequencies of other telephone tones
Type                  Hz        On   Off
-------------------------------------------
Dial Tone          350 &  400   ---   ---
Busy Signal        480 &  620   0.5   0.5
Toll Congestion    480 &  620   0.2   0.3
Ringback (Normal)  440 &  480   2.0   4.0
Ringback (PBX)     440 &  480   1.5   4.5
Reorder (Local)    480 &  620   3.0   2.0
Invalid Number     200 &  400
Hang Up Warning   1400 & 2060   0.1   0.1
Hang Up           2450 & 2600   ---   ---
*/

HANDLE hEvent;

void CALLBACK waveOutProc(
 HWAVEOUT hwo,
 UINT uMsg,
 DWORD dwInstance,
 DWORD dwParam1,
 DWORD dwParam2
) {
  if (uMsg==WOM_DONE) {
    SetEvent(hEvent);
  }
  return;
}

int _tmain(int argc, TCHAR *argv[]) {
  hEvent=CreateEvent( NULL,TRUE,FALSE,NULL);

  WAVEFORMAT_MIDI wfm;
  memset(&wfm,0,sizeof(wfm));
  wfm.wfx.wFormatTag=WAVE_FORMAT_MIDI;
  wfm.wfx.nChannels=1;
  wfm.wfx.nSamplesPerSec=32;
  wfm.wfx.nAvgBytesPerSec=32;
  wfm.wfx.nBlockAlign=sizeof(WAVEFORMAT_MIDI_MESSAGE);
  wfm.wfx.wBitsPerSample=16;
  wfm.wfx.cbSize=WAVEFORMAT_MIDI_EXTRASIZE;
  wfm.USecPerQuarterNote=9600000; // Force each tick to be 1/10 sec

  MMRESULT Result;
  HWAVEOUT hWaveOut;

  Result = waveOutOpen(&hWaveOut, WAVE_MAPPER,
                       (LPWAVEFORMATEX)&wfm, (DWORD)waveOutProc,
                       0, CALLBACK_FUNCTION);

  if (Result!=MMSYSERR_NOERROR) {
    return -1;
  }

  WAVEFORMAT_MIDI_MESSAGE MidiMessage[5];
  MidiMessage[0].DeltaTicks=0;
  MidiMessage[0].MidiMsg=0x203F0000 | 480;
  MidiMessage[1].DeltaTicks=0;
  MidiMessage[1].MidiMsg=0x203F0000 | 620;
  MidiMessage[2].DeltaTicks=2;
  MidiMessage[2].MidiMsg=0x303F0000 | 480;
  MidiMessage[3].DeltaTicks=0;
  MidiMessage[3].MidiMsg=0x303F0000 | 620;
  MidiMessage[4].DeltaTicks=3;
  MidiMessage[4].MidiMsg=0; // Dummy msg, does nothing

  WAVEHDR WaveHdr;
  WaveHdr.lpData = (LPSTR)&MidiMessage;
  WaveHdr.dwBufferLength = sizeof(MidiMessage);
  WaveHdr.dwFlags = WHDR_BEGINLOOP|WHDR_ENDLOOP;
  WaveHdr.dwLoops = 20;
  Result = waveOutPrepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr));

  Result = waveOutWrite(hWaveOut,&WaveHdr,sizeof(WaveHdr));
  WaitForSingleObject(hEvent,INFINITE);
  Result = waveOutUnprepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr));
  Result = waveOutClose(hWaveOut);
  return 0;
}


Записан

while (8==8)
rainbowhope
Гость
« Ответ #4 : 13-03-2009 07:57 » 

Во, нашел в MSDN. Хватит такого частотного диапазона?

Большое спасибо!
А до 10-20 kGz можно выжать?

« Последнее редактирование: 13-03-2009 09:31 от Джон » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 13-03-2009 08:09 » 

rainbowhope, сколько карта твоя поддерживает, столько и можно. Если ты читал Вики по ссылке в моем ответе, то должен знать, сколько можно и чего вообще ждать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
rainbowhope
Гость
« Ответ #6 : 13-03-2009 10:45 » 

Пытаюсь компилять, указанный выше пример, но просит wfmtmidi.h. Этот хэдер где взять, либо какую библиоеку нужн установить, чтобы он появился?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 13-03-2009 15:32 » 

Цитата
А до 10-20 kGz можно выжать?
А у тебя музыкальный слух? Насколько я знаю уже в районе 16 килогерц у большинтсва людей полный завал. Да и как правило динамики и наушники, не специализированные, примерно на этих частотах уходят в завал.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
rainbowhope
Гость
« Ответ #8 : 13-03-2009 17:48 » 

Цитата
А до 10-20 kGz можно выжать?
А у тебя музыкальный слух? Насколько я знаю уже в районе 16 килогерц у большинтсва людей полный завал. Да и как правило динамики и наушники, не специализированные, примерно на этих частотах уходят в завал.

Мне нужен генератор сигналов иммитации датчиков автомобиля(Ремонт).
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 18-03-2009 16:45 » 

rainbowhope, еще раз, вдогонку: прочти статью в Вики - там понятным языком описывается теория.
Ограничения простые (для одиночных синусоид):
1. Нельзя получить частоту выше половины частоты дискретизации.
2. Синусоида с частотой, не кратной половине частоты дискретизации, будет иметь негармоническое искажение в виде подмешенного слабого нискочастотного сигнала.
3. Гармонические искажения уменьшаются при увеличении числа отсчетов, описывающих один период синусоиды.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines