• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Создание сигнала

  • Автор темы Автор темы Syras
  • Дата начала Дата начала

Syras

Ученик
Регистрация
2 Дек 2011
Сообщения
11
Реакции
0
Баллы
0
Создание сигнала

Ув. гуру, подскажите пожалуйста. Есть функция A*sin(2*pi*f). Как создать wav файл этой функции с амплитудой А, частотой f и длинной T
 
я когда-то тоже интересовался примерно таким же. но так ничего и не сделал(( выкопал, что для этого надо копать в сторону directsound кажись...
 
вот нашел исходник

Код:
[QUOTE][B]Пример записи wav[/B]

     Наконец дошли руки написал процедуру записи wav файлов.
    Отмечаю следующие особенности: Запись [B] TWaveHeaderChank[/B] следует обявлять с директивой [B]packed[/B], в связи с тем, что формат wav подразумевает выравнивание  на границу 2 байт, а delphi по умалчанию выравнивает на границу 4 байт.  Т.о. размер структуры [B] TWaveHeaderChank[/B] без диретивы [B] packed[/B] будет занимать 20 байт(структура в примере программ) вместо положенных 18.
    Следующая программа записывает одноканальный wav файл длительностью  10 сек, 16 бит выборка. Звук будет напоминать свисты коротковолнового  радиоприемника.
 [FONT=&quot] TWaveHeaderChank = [B][COLOR=black]packed[/COLOR][/B] [B][COLOR=black]record[/COLOR][/B]  [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT=&quot]Заголвок[/FONT][/COLOR][COLOR=navy][FONT=&quot] ([/FONT][/COLOR][COLOR=navy][FONT=&quot]чанк[/FONT][/COLOR][COLOR=navy][FONT=&quot]) [/FONT][/COLOR][COLOR=navy][FONT=&quot]формата[/FONT][/COLOR][/I][FONT=&quot]  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]wFormatTag     : Smallint;  [/FONT]
 [FONT=&quot]    wChannels      : WORD;  [/FONT]
 [FONT=&quot]    wSamplesPerSec : Cardinal;  [/FONT]
 [FONT=&quot]    wAvgBytesPerSec: Cardinal;  [/FONT]
 [FONT=&quot]    wBlockAlign    : WORD;  [/FONT]
 [FONT=&quot]    wBitsPerSample : WORD;  [/FONT]
 [FONT=&quot]    wcbSize        : WORD;  [/FONT]
 [FONT=&quot]  [B][COLOR=black]end[/COLOR][/B];[/FONT] [FONT=Courier New CYR]-------------------------------------------------------------------[/FONT]
 [B][COLOR=black][FONT=&quot]Const[/FONT][/COLOR][/B][FONT=&quot]  [/FONT]
 [FONT=&quot]  noError            = [COLOR=navy]0[/COLOR];  [/FONT]
 [FONT=&quot]  ReadError          = [COLOR=navy]1[/COLOR];  [/FONT]
 [FONT=&quot]  HeaderError        = [COLOR=navy]2[/COLOR];  [/FONT]
 [FONT=&quot]  DataError          = [COLOR=navy]3[/COLOR];  [/FONT]
 [FONT=&quot]  FileCorrupt        = [COLOR=navy]4[/COLOR];  [/FONT]
 [FONT=Courier New]  [/FONT][FONT=&quot]IncorectFileFormat = [COLOR=navy]5[/COLOR];  [/FONT]
 [FONT=&quot]  HeaderWriteError   = [COLOR=navy]6[/COLOR];  [/FONT]
 [FONT=&quot]  StreamError        = [COLOR=navy]7[/COLOR];[/FONT] [FONT=Courier New CYR]-------------------------------------------------------------------[/FONT]
 [B][COLOR=black][FONT=&quot]Function[/FONT][/COLOR][/B][FONT=&quot] WriteWave(FileName : AnsiString; data : TWaveResult) : WORD;  [/FONT]
 [B][COLOR=black][FONT=&quot]var[/FONT][/COLOR][/B][FONT=&quot]  [/FONT]
 [FONT=&quot]  f             : TFileStream;  [/FONT]
 [FONT=&quot]  wFileSize     : Cardinal;  [/FONT]
 [FONT=&quot]  wChankSize    : Cardinal;  [/FONT]
 [FONT=&quot]  ID            : [B][COLOR=black]array[/COLOR][/B][[COLOR=navy]0[/COLOR]..[COLOR=navy]3[/COLOR]] [B][COLOR=black]of[/COLOR][/B] Char;  [/FONT]
 [FONT=&quot]  Header        : TWaveHeaderChank;  [/FONT]
 [FONT=&quot]   [/FONT]
 [B][COLOR=black][FONT=&quot]Begin[/FONT][/COLOR][/B][FONT=&quot]  [/FONT]
 [FONT=&quot]   Result := noError;  [/FONT]
 [FONT=&quot]   [B][COLOR=black]Try[/COLOR][/B]  [/FONT]
 [FONT=&quot]    f := TFileStream.Create(FileName, fmCreate);  [/FONT]
 [FONT=&quot]    f.Seek([COLOR=navy]0[/COLOR], soFromBeginning);  [/FONT]
 [FONT=&quot]   [/FONT]
 [FONT=&quot]    Header.wFormatTag     := [COLOR=navy]1[/COLOR];  [/FONT]
 [FONT=&quot]    Header.wChannels      := data.wChannels;  [/FONT]
 [FONT=&quot]    Header.wSamplesPerSec := data.wSamplesPerSec;  [/FONT]
 [FONT=&quot]    Header.wBlockAlign    := data.wChannels * (data.wBitsPerSample [B][COLOR=black]div[/COLOR][/B] [COLOR=navy]8[/COLOR]);  [/FONT]
 [FONT=&quot]    Header.wAvgBytesPerSec:= data.wSamplesPerSec * Header.wBlockAlign;  [/FONT]
 [FONT=&quot]    Header.wBitsPerSample := data.wBitsPerSample;  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]Header.wcbSize        := [COLOR=navy]0[/COLOR]; [I][COLOR=navy]//нет дополнительного блока[/COLOR][/I]  [/FONT]
 [FONT=&quot]   [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]ID := [COLOR=#500080]'RIFF'[/COLOR];  [/FONT]
 [FONT=&quot]    f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]);  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]wFileSize := [COLOR=navy]0[/COLOR];       [I][COLOR=navy]//пока не известен[/COLOR][/I]  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]f.WriteBuffer(wFileSize, [COLOR=navy]4[/COLOR]);  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]ID := [COLOR=#500080]'WAVE'[/COLOR];  [/FONT]
 [FONT=&quot]    f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]); [I][COLOR=navy]//Запись идентификатора формата[/COLOR][/I]  [/FONT]
 [FONT=&quot]   [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]ID := [COLOR=#500080]'fmt '[/COLOR];           [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]);                  [I][COLOR=navy]//Запись идентификатора чанка формата[/COLOR][/I]  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]wChankSize := SizeOf(Header);  [/FONT]
 [FONT=&quot]    f.WriteBuffer(wChankSize, [COLOR=navy]4[/COLOR]);              [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT=&quot]Запись[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]размера[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]чанка[/FONT][/COLOR][/I][FONT=&quot]  [/FONT]
 [FONT=&quot]    f.WriteBuffer(Header, SizeOf(Header)); [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT=&quot]Запись[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]чанка[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]формата[/FONT][/COLOR][/I][FONT=&quot]  [/FONT]
 [FONT=&quot]   [/FONT]
 [FONT=&quot]   [B][COLOR=black]except[/COLOR][/B]  [/FONT]
 [FONT=&quot]    Result := HeaderWriteError;  [/FONT]
 [FONT=&quot]   [B][COLOR=black]end[/COLOR][/B];  [/FONT]
 [FONT=&quot]   [/FONT]
 [FONT=&quot]   [B][COLOR=black]Try[/COLOR][/B]  [/FONT]
 [FONT=&quot]    ID := [COLOR=#500080]'data'[/COLOR];  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]);                  [I][COLOR=navy]//Запись чанка данных[/COLOR][/I]  [/FONT]
 [FONT=&quot]    wChankSize := data.Data.Size;          [I][COLOR=navy]//Запись размера чанка[/COLOR][/I]  [/FONT]
 [FONT=Courier New CYR]    [/FONT][FONT=&quot]f.WriteBuffer(wChankSize, [COLOR=navy]4[/COLOR]);          [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT=&quot]Запись[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]данных[/FONT][/COLOR][/I][FONT=&quot]  [/FONT]
 [FONT=&quot]    data.Data.Seek([COLOR=navy]0[/COLOR], soFromBeginning);  [/FONT]
 [FONT=&quot]    f.CopyFrom(data.Data, data.Data.Size);  [/FONT]
 [FONT=&quot]   [/FONT]
 [FONT=&quot]   [B][COLOR=black]except[/COLOR][/B]  [/FONT]
 [FONT=&quot]    Result := StreamError;  [/FONT]
 [FONT=&quot]   [B][COLOR=black]end[/COLOR][/B];  [/FONT]
 [FONT=&quot]   f.Seek(SizeOf(ID), soFromBeginning);     [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT=&quot]Поиск[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]записи[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]размера[/FONT][/COLOR][COLOR=navy][FONT=&quot] [/FONT][/COLOR][COLOR=navy][FONT=&quot]файла[/FONT][/COLOR][/I][FONT=&quot]  [/FONT]
 [FONT=&quot]   wFileSize := f.Size - SizeOf(ID) - SizeOf(wFileSize);   [/FONT]
 [FONT=Courier New CYR]   [/FONT][FONT=&quot]f.[B][COLOR=black]Write[/COLOR][/B](wFileSize, [COLOR=navy]4[/COLOR]);                   [I][COLOR=navy]//Запись размера файла - заголовок[/COLOR][/I]  [/FONT]
 [FONT=Courier New CYR]   [/FONT][FONT=&quot]f.Free;  [/FONT]
 [B][COLOR=black][FONT=&quot]end[/FONT][/COLOR][/B][FONT=&quot];  [/FONT]
 [FONT=&quot]   [/FONT]
 [B][COLOR=black][FONT=&quot]procedure[/FONT][/COLOR][/B][FONT=&quot] TForm1.Button2Click(Sender: TObject);  [/FONT]
 [B][COLOR=black][FONT=&quot]var[/FONT][/COLOR][/B][FONT=&quot]  [/FONT]
 [FONT=&quot]  r : TWaveResult;  [/FONT]
 [FONT=&quot]  i : Integer;  [/FONT]
 [FONT=&quot]  d : SmallInt;  [/FONT]
 [FONT=&quot]    [/FONT]
 [B][COLOR=black][FONT=&quot]begin[/FONT][/COLOR][/B][FONT=&quot]  [/FONT]
 [FONT=&quot]  r.ERROR := noError;  [/FONT]
 [FONT=&quot]  r.wSamplesPerSec := [COLOR=navy]44100[/COLOR];  [/FONT]
 [FONT=&quot]  r.wBitsPerSample := [COLOR=navy]16[/COLOR];  [/FONT]
 [FONT=&quot]  r.wChannels      := [COLOR=navy]1[/COLOR];  [/FONT]
 [FONT=&quot]  r.Data           := TMemoryStream.Create;  [/FONT]
 [FONT=&quot]  r.Data.Seek([COLOR=navy]0[/COLOR], soFromBeginning);  [/FONT]
 [FONT=&quot]   [/FONT]
 [FONT=&quot]  [B][COLOR=black]For[/COLOR][/B] i := [COLOR=navy]1[/COLOR] [B][COLOR=black]to[/COLOR][/B] [COLOR=navy]10[/COLOR] * r.wSamplesPerSec  [/FONT]
 [FONT=&quot]  [B][COLOR=black]do[/COLOR][/B]  [/FONT]
 [FONT=&quot]    [B][COLOR=black]Begin[/COLOR][/B]  [/FONT]
 [FONT=&quot]      d := Round(High(SmallInt) * Sin([COLOR=navy]2[/COLOR] * Pi * ([COLOR=navy]5[/COLOR] * i / r.wSamplesPerSec) * ([COLOR=navy]500[/COLOR] * i / r.wSamplesPerSec)));  [/FONT]
 [FONT=&quot]      r.Data.WriteBuffer(d, [COLOR=navy]2[/COLOR]);  [/FONT]
 [FONT=&quot]    [B][COLOR=black]end[/COLOR][/B];  [/FONT]
 [FONT=&quot]  WriteWave([COLOR=#500080]'Sample.wav'[/COLOR], r);  [/FONT]
 [FONT=&quot]  r.Data.Free;  [/FONT]
 [B][COLOR=black][FONT=&quot]end[/FONT][/COLOR][/B][FONT=&quot];[/FONT][/QUOTE]
 
Назад
Сверху