Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > получить параметры звука


Автор: Albinos_x 11.7.2005, 18:03
Доброго всем времени суток!

возник вопрос: как с микрофона снять тон, тембр и амплитуду звука?

Заранее всем спасибо!


Автор: Snowy 12.7.2005, 09:18
Читай в DRKB "Как считать сигнал с микрофона"
Добавлено @ 09:21
И еще в FAQ:
http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=main_panel&article=1515

Автор: Albinos_x 12.7.2005, 19:35
Код

var 
  WaveIn: hWaveIn; 
  hBuf: THandle; 
  BufHead: TWaveHdr; 
  bufsize: integer; 
  Bits16: boolean; 
  p: PPointArr; 
  stop: boolean = false; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  header: TWaveFormatEx; 
  BufLen: word; 
  buf: pointer; 
begin 
  BufSize := TrackBar1.Position * 500 + 100; { Размер буфера } 
  Bits16 := CheckBox1.Checked; 
  with header do begin 
    wFormatTag := WAVE_FORMAT_PCM; 
    nChannels := 1;  { количество каналов } 
    nSamplesPerSec := 22050; { частота } 
    wBitsPerSample := integer(Bits16) * 8 + 8; { 8 / 16 бит } 
    nBlockAlign := nChannels * (wBitsPerSample div 8); 
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; 
    cbSize := 0; 
  end; 
  WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header), 
    Form1.Handle, 0, CALLBACK_WINDOW); 
  BufLen := header.nBlockAlign * BufSize; 
  hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen); 
  Buf := GlobalLock(hBuf); 
  with BufHead do begin 
    lpData := Buf; 
    dwBufferLength := BufLen; 
    dwFlags := WHDR_BEGINLOOP; 
  end; 
  WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead)); 
  WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead)); 
  GetMem(p, BufSize * sizeof(TPoint)); 
  stop := true; 
  WaveInStart(WaveIn); 
end; 


тогда кто-нибудь может пояснить, как из этого можно извлечь нужную информацию...Потому что я, из этого, почти ничего не понял

в FAQ конкретно на этот вопрос не отвечает, там как считать и записать этот звук в файл или может я чего не догоняю...

если кто знает поясните пожалуйста smile

Автор: Guest 14.7.2005, 03:30
Я так полагаю, вам придется раскладывать полученый оцифрованный сигнал на составляющие. Методы разложения звука есть, но я не возьмусь их объяснять потому что не соображаю в этом ничего. Примеров тоже, к сожалению, не имею. Кроме того, вопрос поставлен не совсем корректно. Тон, тембр и амплитуда на одном и том же микрофоне будут у всех разные. Думаю, можно будет попробовать изменить их значения но не измерить. Это все имхо, вопросом особенно не владею, а хотелось бы.
И вот от меня вопрос: как записать звук с микрофона в файл wav. Не ругайтесь пожалуйста, но с приведенным в DRKB примером я чего-то справиться не могу. smile Все дороги туда ведут, а я чего-то не догоняю. Создаю пустой файл в "Звукозапись" с параметрами из примера. Потом записываю в него данные сигнала:
Код

//------фрагмент--------------
 if Bits16 then begin
    data16 := PData16(PWaveHdr(Msg.lParam)^.lpData);
    YScale := h / (1 shl 16);
    for i := 0 to BufSize - 1 do
      p^[i] := Point(round(i * XScale),
        round(h / 2 - data16^[i] * YScale));

    WavFile.Write(data16^,SizeOf(TData16)); //это звуковые данные?
  end else begin
    Data8 := PData8(PWaveHdr(Msg.lParam)^.lpData);
    YScale := h / (1 shl 8);
    for i := 0 to BufSize - 1 do
    begin
      p^[i] := Point(round(i * XScale),
        round(h - data8^[i] * YScale));

    end;

    WavFile.Write(data8^,SizeOf(TData8)); //это звуковые данные?
.......

Потом пытаюсь проиграть в винампе. Результат очень далек от оригинала. Причем понятно что это именно моя запись - только на большой/маленькой скорости. Почему-то скорость воспроизводимого звука зависит от размера буфера BufSize. smile Для 8-ми битного получалось рычание как из ужастиков... В общем помогите разобраться.

Автор: Vzhyk 14.7.2005, 15:44
Цитата(Albinos_x @ 11.7.2005, 18:03)
тон, тембр и амплитуду звука?

Что есть в твоем понимании "тон, тембр"?

Те же отсчеты сигнала, что ты получишь со звуковой карточки и есть "амплитуда".

Автор: Albinos_x 14.7.2005, 19:23
Цитата
Что есть в твоем понимании "тон, тембр"?


тон - частота сигнала (количество циклов в секунду)
амплитуда - сила сигнала
тембр - качественная характеристика. Думаю правильнее сказать, что она определяется корреляцией между чистой синусуидальной волной и издаваемой. Например настроенный камертон даёт почти чистую синусоидальную волну, а флейта на той же волне даёт звук более сложного состава.

Цитата
Думаю, можно будет попробовать изменить их значения но не измерить.


Мне нужно, именно измерить.

Цитата
Те же отсчеты сигнала, что ты получишь со звуковой карточки и есть "амплитуда".


если не сложно - можно поподробнее...

Автор: Vzhyk 14.7.2005, 22:28
Убийственная терминология. smile

Похоже, что использована та, которая применятся музыкантами. Я не музыкант и догадаться о соотвествии твоих терминов с общепринятыми не в силах.

Если хочешь, все-таки, получить реальную помошь объясни обычным русским языком, что ты хочешь сделать.
Или приведи формулы вычисления твоих терминов.

По поводу амплитуды (мгновенный уровень величины сигнала): на входе звуковой карточки ты имеешь непрерывный сигнал в вольтах, после АЦП ты имешь уже сигнал дискретизованый как по времени, так и по амплитуде, вот эти циферки ты уже и имешь в своей программе (получаешь которые при помощи MultimeAPI, DirectX, OpenAL или еще чего).

Бог мог, да почитай какую-нибудь популярную книжку по "программированию звука" - этого добра навыпускали сейчас выше крыши. Лекции здесь читать я не собираюсь по основам ЦОС (их дают во всех технических вузах).

Добавлено @ 22:29
Под тоном, я видел только следующие определения (если можно так сказать)ю
Добавлено @ 22:32
Под тоном, я видел только следующие определения (если можно так сказать).

Речевой сигнал, под тоном понимают частоту колебания головых связок, ее и называют основным тоном.
В музыке (могу и ошибиться, подправьте, если есть более четкое определение), первую гармонику в спектре сигнала музыкального инструмента.

Автор: Albinos_x 14.7.2005, 22:52
Цитата
Под тоном, я видел только следующие определения (если можно так сказать).

Речевой сигнал, под тоном понимают частоту колебания головых связок, ее и называют основным тоном.
В музыке (могу и ошибиться, подправьте, если есть более четкое определение), первую гармонику в спектре сигнала музыкального инструмента.


определения взяты из технической литературы...

Цитата
Если хочешь, все-таки, получить реальную помошь объясни обычным русским языком, что ты хочешь сделать.
Или приведи формулы вычисления твоих терминов.


надо распознать голос, по контрольным данным в частности тембору и частоте сигнала
амплитуда собираюсь использовать для создания порогового значения, начиная с которого будет распознаваться голос.

Цитата
Бог мог, да почитай какую-нибудь популярную книжку по "программированию звука" - этого добра навыпускали сейчас выше крыши. Лекции здесь читать я не собираюсь по основам ЦОС (их дают во всех технических вузах).


поисковики по этому поводу ничего толкового не выдали, а купить книгу не могу, т.к. мои выходние не совпадают с рабочими днями крупных книжных магазинов(работаю далеко от города, да и живу не близко).

Автор: Vzhyk 14.7.2005, 23:19
Цитата

надо распознать голос, по контрольным данным в частности тембору и частоте сигнала
амплитуда собираюсь использовать для создания порогового значения, начиная с которого будет распознаваться голос.

Ну вот так чуть получше. Но подход не верный и термин "тембр" а данном варианте не применяется в ЦОС, он используется в лингвистике.
Если же тебе нужно только определить наличие голоса в сигнале, то это VAD-voice activity detection (красивого русского термина не знаю), но по этой аббревиатуре любой поисковик выдаст тучу ссылок. И конечно, спасибо Евгению Машерову за подборку, dsp-book.narod.ru.
Теперь дальше, не хочу много раз писать одно и тоже (а еще учитывая, что в распознавании речевых образов ты еще практически ноль) вот ссылка http://forum.sources.ru/index.php?showtopic=64693? для начала хватит, а потом сам поймешь где и что искать и как делать.

Как совет: сделай сам распознавалку, для начала на MFCC or LPCC + DTW (по ссылкам все там это есть, и даже переведенное на русский).

И еще, есть очень хороший учебник по ЦОС: Баскаков С.И. Радиотехнические цепи и сигналы: Учебник. - М.:Высш. школа., 1983. - это для начала.
А потом литература на dsp-book.narod.ru.

P.S.
Цитата
определения взяты из технической литературы...
- очень прикольно, дай ссылки, что же там написано, почитать, ну очень интересно.

Автор: Albinos_x 14.7.2005, 23:37
Во... другое дело...

СПАСИБО! smile

Цитата
- очень прикольно, дай ссылки, что же там написано, почитать, ну очень интересно.


"Turbo Paskal" Учебник, С.А. Немнюгин изд. Питер
раздел "Урок 8. Программирование звука" тема: "Программирование SoundBlaster" п. "Звук и его своиство"

Автор: Vzhyk 14.7.2005, 23:41
Какой вопрос - такой ответ. Или по другому, правильная постановка вопроса - половина ответа

Цитата(Albinos_x @ 14.7.2005, 23:37)
"Turbo Paskal"  Учебник, С.А. Немнюгин изд. Питер
раздел "Урок 8. Программирование звука" тема: "Программирование SoundBlaster" п. "Звук и его своиство"

Да это круто... Теперь понимаю, откуда такой кошмар. Но книжки же в библиотеке должны быть нормальные. Не читал, на паскале не пишу, но предполагаю, что и остальные у него части ничем не лучше.
Классику по ЦОС (DSP), практически всю найдешь на dsp-book.narod.ru.

P.S. Ты же делал программку осциллографа, а задаешь такие вопросы. Что показывает осциллограф на своем экране? smile

Автор: Albinos_x 18.7.2005, 19:45
Цитата
P.S. Ты же делал программку осциллографа, а задаешь такие вопросы. Что показывает осциллограф на своем экране?


делал осцилограф для входных цепей (с антены) приёмной аппаратуры. И я всего лишь моделировал сигнал по входным(заданным) параметрам и выводил это на свой осцилограф. А здесь мне моделировать ничего не надо, надо снять сигнал со звуковой карты, замерить частоту (это вроде не сложно), снять апмлитуду (это думую тоже не сложно, хотя пока ещё не догнал как), снять гармоники с сигнала и сравнить и с исходними (со сравнением проблем нет, а вот на счёт гармоник, пока работаем)

Автор: Vzhyk 19.7.2005, 13:50
Цитата(Albinos_x @ 18.7.2005, 19:45)
А здесь мне моделировать ничего не надо, надо снять сигнал со звуковой карты, замерить частоту (это вроде не сложно), снять апмлитуду (это думую тоже не сложно, хотя пока ещё не догнал как), снять гармоники с сигнала и сравнить и с исходними (со сравнением проблем нет, а вот на счёт гармоник, пока работаем)

Так отсчеты сигнала и есть его амплитуда, или нет?
А для получения спектра сигнала преобразование фурье не подходит? (чтобы самому время на отладку не терять бери FFTW или IT++).

Автор: Albinos_x 19.7.2005, 17:13
Цитата
Так отсчеты сигнала и есть его амплитуда, или нет?


что есть - отсчеты?

Цитата
А для получения спектра сигнала преобразование фурье не подходит?


возможно именно его я и буду использовать..

Цитата
(чтобы самому время на отладку не терять бери FFTW или IT++).


???????? не понял... ?????

Автор: Vzhyk 19.7.2005, 19:02
Дискретные значения величины сигнала в дискретные моменты, которые ты получаешь с АЦП платы.
Это свободные библиотеки для преобразования фурье и не только.

Автор: Albinos_x 19.7.2005, 19:29
Цитата
Дискретные значения величины сигнала в дискретные моменты, которые ты получаешь с АЦП платы.


это уже понял, прочитал статейку, только там они по другому назывались

Цитата
Это свободные библиотеки для преобразования фурье и не только.


а не подскажешь:
где их можно скачать, сколько весят, и где можно найти описание...

Автор: Vzhyk 20.7.2005, 13:01
Ну ты вообще, а в google слабо?
http://www.google.com/search?q=FFTW
http://www.google.com/search?q=IT++

Автор: Albinos_x 20.7.2005, 17:41
Цитата
Ну ты вообще, а в google слабо?


в английском слабоват... поэтому на сайты на английском не суюсь...

ну раз так, то придётся...

****
уффф..... я енто переводить только неделю буду....

Автор: Vzhyk 20.7.2005, 22:54
А что библиотеки или исходники бывают на русском?
А по преобразованию Фурье прочитаешь в любом русском учебнике по обработке сигналов и "матану". Ссылки я уже давал. Но и в любой библиотеке их должно быть много.

Но как совет, прежде, чем что-то программировать, желательно почитать учебники.
Добавлено @ 22:57
Да и еще, на русском тематических сайтов особенно связанных с естественными науками скоро не останется вообще. Нет в них востребованности достаточной, да и грамотные спецы туда и носа не суют. Вся наука нынче в америке и немного в европе с японией.

Автор: Albinos_x 20.7.2005, 23:09
Цитата
А что библиотеки или исходники бывают на русском?


да я не про библиотеки... я про сайты на которых эти библиотеки находятся... и про описание...

Цитата
Но как совет, прежде, чем что-то программировать, желательно почитать учебники.


вот поэтому и спрашиваю... думал может кто здесь может популярно объяснить хотябы смысл. А в математике вроде не слабак...

Автор: Vzhyk 21.7.2005, 21:44
Смысл чего, ЦОС, распознавания образов?
Здесь не место для длительных лекций, да и у людей дел куча то же.

Автор: Albinos_x 21.7.2005, 22:36
Цитата
Смысл чего, ЦОС, распознавания образов?


нет... мне нужно было - как из принятой в буффер информации выделить информацию о амплетуде, частоте и гармоники....

Автор: Vzhyk 22.7.2005, 22:02
Расскажи мне, что у тебя за информация в буфере, когда расскажешь, сам поймешь.

Автор: Albinos_x 26.7.2005, 17:28
Цитата
Расскажи мне, что у тебя за информация в буфере, когда расскажешь, сам поймешь.


поэтому и спрашиваю.... ну не догоняю, что и в каком формате туда записывается...вернее приблизительно понимаю, но это приблизительно мне не подходит... smile

знал бы, то и не спрашивал... smile

Автор: [email protected] 4.12.2005, 21:38
когда узнаешь как узнать амплитду мне тоже отправь код программы

Автор: Albinos_x 5.12.2005, 02:41
Цитата(omax89 @ 4.12.2005, 21:38)
когда узнаешь как узнать амплитду мне тоже отправь код программы

она не является постоянной...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)