Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2012, 11:18   #31
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
Практически все понял) Не понял лишь, как все расчитывать.
Давайте начнем с начала. Частота дискретизации - эта та частота, с которой мы "ставим точки на графике".
Надо как-нибудь что-нибудь обозначить. Честно говоря, уже давно не пользовался никакими учебниками, поэтому вводимые мной обозначения могут не совпадать с общепринятыми.
Пусть:
f - частота звука.
w - частота дискретизации.
A - амплитуда.
i - так мы назовем номер текущего отсчета, который нужно поместить в буфер (по совместительству - она же переменная цикла).
В общем случае звук частотой f описывается формулой:
y = A*sin(2*Pi*f*t),
где:
t - время,
Pi = 3.14159265.
Учитывая, что при частоте дискретизации w на одно измерение приходится 1/w секунды, запишем:
t = i/w
откуда:
y = A*sin(2*Pi*f*i/w)

Последний раз редактировалось s-andriano; 29.04.2012 в 11:21.
s-andriano вне форума Ответить с цитированием
Старый 30.04.2012, 02:29   #32
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

Да, ребят, вы правы: ничерта я не справился с этими частотами....
Сейчас переписываю программу, выложу. Вроде бы разобрался что к чему, но один не отвеченный вопрос все-таки остался. Как допишу, задам его.
Но, похоже, что всемогущий s-andriano, ответ уже написал в предыдущем сообщении)))

Последний раз редактировалось IgoRek125; 30.04.2012 в 02:33.
IgoRek125 вне форума Ответить с цитированием
Старый 30.04.2012, 05:53   #33
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

Спасибо большое, s-andriano. Твоя помощь неизмерима!

А теперь о том самом вопросе.
Думал, думал я и как-то напечатал. Получился вот такой текст программы:
PHP код:
   try
      
r.Data:=nil;
      
with r do begin                     
         wSamplesPerSec
:=44100;           // частота, т.е. ЧАСТОТА ДИСКРЕТИЗАЦИИ
         
wBitsPerSample:=16;              // битность
         
wChannels:=2;                    // число каналов
         
Data:=TMemoryStream.Create;      // создание буфера для данных о звуке
         
Data.Seek(0,soFromBeginning);    // встаю в начально списка этих данных
         
end;

ampl:=round(r.wSamplesPerSec/Chastota);         // Chastota - это частота Звука
      
For y:=0 to Image1.Height-do begin      // и она ввоится пользователем
         
For x:=0 to Image1.Width-do begin                                              
            
If massiv[x,y]=True
               then begin
                  
For i:=0 to ampl do begin           //              //
                     
d:=30000;                        //  есть пик    //
                     
d:=d-(i);                        //              //
                     
r.Data.WriteBuffer(d4);        //              // 
                     
end;                             //              // первый канал
                  
end                                                 // 
               
else begin                                             //
                  
For i:=0 to ampl do begin           //              //
                     
d:=0;                            //  нет пика    //
                     
r.Data.WriteBuffer(d4);        //              //
                     
end;                             //              //
               
end
Впринцепи у меня и получились "правильные" данные звука. Все они встали на свои места, и, главное, их число приняло те величины, которые так необходимы для правильного формирования, звучания, записи, ну и прочего...
Как вы могли обратить внимание, на месте, помеченном как есть пик, присутствует переменная d и довольно интересная формула d:=d-(i) . Не пытайтесь отгадать откуда я ее взял: она была подарена мне небесной силой под названием фантазия (слава богу и судьбе, этим я не обделен) , т.е. на самом деле я пытаюсь сформировать определенную формулу, которая дала бы мне вот такой вид синусоиды или амплитуды, совсем я уже запутался что есть что, в общем необходим вот такой вот ее вид:











Серая стрелочка справа - это уровень громкости звука. Число 30 000 я взял чисто на угад, ну как будто это самая высокая точка, необходимая мне. Переменная ampl = частота дискретизации поделенная на частоту звука, т.е длительность одного герца частоты звука. А вот как сформировать формулу, я никак не соображу. Мне ясно только, что в ней должны присутствовать переменные d, ampl и i, как единица изменения.
Как вот расчитать все зеленые сэмплы (точки), отмеченные синей полосой?

P.S: Я не глупый, но пожалуйста, ради всего святого, когда что-то свято-полезное начнете писать, постарайтесь представить, что пишете для глупого самоучки, не понимающего еще ой как много ни в Delphi, ни в жизни. Так что все советы, как сделать лучше, проще или что-то о рисовании на этой диаграме звука приму с радостью и удовольствием.

Последний раз редактировалось IgoRek125; 30.04.2012 в 16:44.
IgoRek125 вне форума Ответить с цитированием
Старый 30.04.2012, 07:56   #34
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
Переменная ampl = частота дискретизации поделенная на частоту звука, т.е длительность одного герца частоты звука.
Лично я эту фразу понять не могу.
Формула для графика будет выглядеть примерно так:
Код:
if(i >= StartTime) and (i <= EndTime) then
  d := round(MaxAmpl*(1.0 - 2.0*(i-StartTime)/(EndTime-StartTime)))
else
  d := 0;
s-andriano вне форума Ответить с цитированием
Старый 30.04.2012, 16:38   #35
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

StartTime и EndTime - это начало и конец рисования амплитуды,
а MaxAmpl - это мое число 30 000 ?
IgoRek125 вне форума Ответить с цитированием
Старый 30.04.2012, 17:42   #36
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

Вот такой вод текст программы получился:
PHP код:
  try 
      
r.Data:=nil
      
with r do begin                      
         wSamplesPerSec
:=44100;           // частота, т.е. ЧАСТОТА ДИСКРЕТИЗАЦИИ 
         
wBitsPerSample:=16;              // битность 
         
wChannels:=2;                    // число каналов 
         
Data:=TMemoryStream.Create;      // создание буфера для данных о звуке 
         
Data.Seek(0,soFromBeginning);    // встаю в начально списка этих данных 
         
end

ampl:=round(r.wSamplesPerSec/Chastota);         // Chastota - это частота Звука,  и она ввоится пользователем 
      
For y:=0 to Image1.Height-do begin      
         
For x:=0 to Image1.Width-do begin                                               
            
If massiv[x,y]=True
               then begin
                  
For i:=0 to ampl do begin                                       //              //
                     
if(>= 0) and (<= ampl)                                   //              //
                     
then begin d := round(30000*(1.0 2.0*(i-0)/(ampl-0))) end  // есть пик     //
                     
else begin d := 0end;                                      //              //
                     
r.Data.WriteBuffer(d4);                                    //              //
                     
end;                                                         //              // первый канал
                  
end                                                                             //
               
else begin                                                                         //
                  
For i:=0 to ampl do begin                                       //              //
                     
d:=0;                                                        //  нет пика    //
                     
r.Data.WriteBuffer(d4);                                    //              //
                     
end;                                                         //              //
               
end
s-andriano, твоя формула работает! Только появилась небольшая погрешность и появляется она вот из этой процедуры ampl:=round(r.wSamplesPerSec/Chastota);
Можно ли как-то побороть эту погрешность?
IgoRek125 вне форума Ответить с цитированием
Старый 30.04.2012, 18:03   #37
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
s-andriano, твоя формула работает! Только появилась небольшая погрешность и появляется она вот из этой процедуры ampl:=round(r.wSamplesPerSec/Chastota);
Начнем с того, что я не знаю, зачем вообще нужна эта формула. Что Вы ею хотите сказать?
Цитата:
Можно ли как-то побороть эту погрешность?
Если слово "погрешность" употреблено Вами правильно, то в формуле присутствует единственный источник погрешности - округление.
И, по физике явления, такая формула ДОЛЖНА приводить к погрешности, т.к. частота дискретизации не обязана быть кратной частоте сигнала.
s-andriano вне форума Ответить с цитированием
Старый 01.05.2012, 23:02   #38
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

s-andriano, ты меня все больше и больше поражаешь. Кто ты такой?Преподователь вуза? Чем в жизни знимаешься? Создаешь для роботов ПО ? Как ты эту формулу так легко написал мне?!!!
И как мне самому создать подобные формулы, если б я захотел вот такие вот синусоиды???
Изображения
Тип файла: jpg Фома Сигнала 2.jpg (18.7 Кб, 136 просмотров)
IgoRek125 вне форума Ответить с цитированием
Старый 02.05.2012, 00:41   #39
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

Буду признателен, если сможешь ответить и на вот этот вопрос
http://programmersforum.ru/showthrea...17#post1032017
IgoRek125 вне форума Ответить с цитированием
Старый 02.05.2012, 08:06   #40
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
И как мне самому создать подобные формулы, если б я захотел вот такие вот синусоиды???
Вообще-то синусоида - это функция вполне определенного вида, и на рисунке ни одной синусоиды нет.
По поводу конструирования функций - тут точного алгоритма нет, и это в какой-то степени искусство.
Прежде всего желательно понять, на что похожа функция, которую мы хотим аппроксимировать. Затем подбираются коэффициенты масштабирования и сдвига.
Т.е.
y = A + B*f(C*x + D)
где:
y - искомая функция,
f - функция, на которую она "похожа",
A, D - коэффициенты сдвига,
B, C - коэффициенты масштабирования.
Это - в простых случаях.
В более сложных используется либо полиномиальная аппроксимация либо кусочная интерполяция.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Звук Звууууук Звук ... не рабоает звук.. Zvuuuuk Компьютерное железо 2 22.01.2011 17:53
Тюнер для гитары в делфи. (Считывать с микрофона звук и выводить какой частоты этот звук). Серего Мультимедиа в Delphi 8 12.01.2011 14:39
создать стерео звук FAiver Мультимедиа в Delphi 3 06.01.2009 11:09
звук и делфи, левый правый звук snusmumric Win Api 2 29.10.2007 11:10
Возможно ли средствами Delphi создать "звук" V_X Помощь студентам 2 19.12.2006 18:24