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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2012, 05:02   #21
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

s-andriano, я впринцепи добился чего хотел. Так уж получилось, что мне нужен звук с частотой меньшей чем 11025 Гц.

s-andriano, подскажи лучше здесь, что у меня не так, если знаешь. Или кто-нибудь, кто знает.

PHP код:
Shag:=True    /// не в цикле разумеется, а перед ним

...........................................................
...........................................................   
begin
   
If Shag=True then begin
      d
:=round(sin(Chastota)*35000);
      
r.Data.WriteBuffer(d2);
      
Shag:=False;
      
end
   
else begin
      d
:=-128;
      
r.Data.WriteBuffer(d2);
      
Shag:=True;
      
end;
   
end
Почему у меня программа не хочет выполнять ложное условие???
IgoRek125 вне форума Ответить с цитированием
Старый 28.04.2012, 10:28   #22
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
что мне нужен звук с частотой меньшей чем 11025 Гц.
частотой или частотой дискретизации?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.04.2012, 11:31   #23
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
Почему у меня программа не хочет выполнять ложное условие???
Потому что это естественно и строго по алгоритму. Почему она должна выполнять ложно условие, если в самом верху написано:
Код:
Shag:=True
Если в цикле, покажите его . Вообще можно изменить алгоритм и вообще избавиться и от переменной Шаг (привыкайте называть переменные английскими буквами - Step, есть же гугл, он не плохо умеет переводить) и от условия.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 28.04.2012 в 11:34.
Utkin вне форума Ответить с цитированием
Старый 28.04.2012, 13:00   #24
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...TC, не могу никак понять, почему вы до их пор не прочитали про WaveForm Audio и не прошлись по указанным ссылкам.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.04.2012, 14:25   #25
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
s-andriano, я впринцепи добился чего хотел. Так уж получилось, что мне нужен звук с частотой меньшей чем 11025 Гц.
Вам уже совершенно справедливо заметили, что частота звука и частота дискретизации - совершенно разные вещи.
Используя частоту дискретизации 11025 Гц, можно создать звук с частотой 0.01 Гц. Ничто этому не мешает.
Цитата:
s-andriano, подскажи лучше здесь, что у меня не так, если знаешь. Или кто-нибудь, кто знает.
Ну, много чего вызывает сомнения.
Во-первых, конечно, совершенно непонятно, чего Вы хотите добиться.
Далее:
Код:
      d:=round(sin(Chastota)*35000);
Что такое "Chastota"?
Если это "частота звука", то код явно неправильный. Более того, sin(Chastota) есть константа, если переменная Chastota не меняется в теле цикла.
Далее, 35000 - это слишком много. Разрядность звука позволяет работать только в пределах от -32768 до +32767. Все, что выше, приводит к переполнению.
Цитата:
Почему у меня программа не хочет выполнять ложное условие???
Она так написана.
s-andriano вне форума Ответить с цитированием
Старый 28.04.2012, 17:00   #26
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

Ребят, вы были абсюлютно правы. Проблема была в следующем:

вот текст программы сейчас:
PHP код:
procedure TForm1.Button7Click(SenderTObject);        // генерации wav данных в Delphi
var
   
x,yinteger;                // для цикла заполнения массива данных звука
   
r         ZvukData;        // чанк данных, там же зафигарена и переменная под данные
   
d         SmallInt;        // данные, которые записываются в файл в конечном итоге
   
Shag      boolean;         // переменная для управления вторым каналом
begin
   
try
      
r.Data:=nil;
      
with r do begin                     
         wSamplesPerSec
:=Chastota;        // частота, она вводится пользователем
         
wBitsPerSample:=16;              // битность
         
wChannels:=2;                    // кол-во каналов
         
Data:=TMemoryStream.Create;      // создание буфера памяти для данных о звуке
         
Data.Seek(0,soFromBeginning);    // что я этим Seek и его параметрами делаю, я не понимаю. Вроде встаю в начало первой единицы данных
         
end;

      
Shag:=True;                         //  ЗАПОЛНЯЕМ ЗВУК ДАННЫМИ
      
For y:=0 to Image1.Height-do begin
         
For x:=0 to Image1.Width-do begin
            
If massiv[x,y]=True then begin
               d
:=Chastota*350;                 // d - видимо это координаты звука в децибелах
               
r.Data.WriteBuffer(d2);        // exp(степень*ln(число))    -  возведение в степень
               
end
            
else begin
               d
:=-128;                   // координаты тишины
               
r.Data.WriteBuffer(d2);
               
end;

            If 
Shag=True then begin                //
               
d:=Chastota*350;                    //
               
r.Data.WriteBuffer(d2);           //
               
Shag:=False;                        //   процедура заполнения второго канала
               
end                                 //
            
else begin                             //
               
d:=-128;                            //
               
r.Data.WriteBuffer(d2);           //
               
Shag:=True;                         //
               
end;                                //

            
Gauge1.Progress:=Gauge1.Progress+1;
            
end;
         
end;
         
WriteWave('Звук.wav'r);                 // функция создание самого звука, и сохранение его на диск!
      
finally
         
r.Data.Free;                              //очистка памяти компьютера
         
end;
   
Gauge1.Progress:=0;
   
Button9.Enabled:=True;
   
MessageBeep(MB_ICONASTERISK);
   
ShowMessage('..... Файл благополучно создан! .....');
   
end
а раньше процедура заполнения второго канала была выведена в отдельную процедуру. Но какого лешева условие False не выполнялось?! А так вдруг заработало..... и между прочем Shag:=True всегда у меня было вне цикла!

также почитал про частоту и частоту дискредитации: ей богу не понял разницы... может на примере объяснено было бы, было б лучше... может, кто знает хорошую статью?

d:=round(sin(Chastota)*35000); - раньше было вбито наобум)), теперь это быглядит просто: d:=Chastota*350;

raxp, читал, смотрел, видно надо перечитать внимательней))
А вообще мне очень помогла статья http://alexei-s1.narod.ru/WAVE.htm Хотя я там всю ночь разбирался что к чему, так как есть места, где все-таки можно было б объяснить на мнооого проще и понятнее. Например, что все эти чанки, как выходит, неважно как записаны в программе, главное, чтоб в файле были записаны именно в таком виде и формате.
IgoRek125 вне форума Ответить с цитированием
Старый 28.04.2012, 19:21   #27
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
также почитал про частоту и частоту дискредитации: ей богу не понял разницы...
Ну, честно говоря, пока Вы этого не поняли, что-либо делать бессмысленно.
Кстати, в приведенной Вами ссылке частота дискретизации называется частотой выборки.
Представьте, что мы пишем звук с микрофона. Для этого мы измеряем напряжение на выходе микрофона через определенные интервалы времени. Частота, с которой мы проводим измерения и называется частотой дискретизации.
А частота звука - та, с которой изменяется звуковое давление, а, следовательно, и напряжение на выходе микрофона.
Представьте, что мы строим график по точкам. Частота, с которой следуют точки, соответствует частоте дискретизации. Для того, чтобы построить график синусоиды, количество точек, приходящихся на период, должно быть, минимум, несколько. Так же и со звуком: по теореме Котельникова частота дискретизации должна минимум вдвое превосходить максимальную частоту того звукового диапазона, который мы хотим записать.
Считается, что человек слышит звук в диапазона от 16 до 20000 Гц. Поэтому для компакт диска выбрана частота дискретизации 44100 Гц, что более чем вдвое выше границы звукового диапазона. В профессиональной аппаратуре принято брать частоту еще выше - 48000 Гц.
Для звуковоспроизведения среднего качества считается достаточно частоты дискретизации 22050 Гц. А для записи речевого сигнала (максимальная частота не превосходит 3500 Гц) - частота дискретизации 11025 Гц.
При этом в сигнале могут присутствовать любые частоты от 0 до 5000 Гц, и даже любые их комбинации, например, аккорды.
Цитата:
теперь это быглядит просто: d:=Chastota*350;
Объясните, все-таки, физический смысл переменной Chastota.

PS. Еще просто убивают конструкции типа
Код:
If Shag=True then
.
Как Вы думаете, если мы вместо этого напишем
Код:
if (((Shag=True) = True) = True) = True then
программа будет работать надежнее?

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

s-andriano, я вам очень при очень преблагодарин. Практически все понял) Не понял лишь, как все расчитывать.
Chastota - у меня она вводится пользователем. И вся фишка в том, что пользователь для работы будет использовать примерную Chastota равную 90Гц - и это у меня частота звука, не Дискредитазации.
Мне уже и с самого начала было ясно, что моя формула d:=Chastota*350; - это не то, что мне нужно.
Быть может подскажете как должна выглядить формула? я так понял, что d - это и есть моя частота дискретизации получается?
IgoRek125 вне форума Ответить с цитированием
Старый 28.04.2012, 19:47   #29
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию

Код HTML:
if (((Shag=True) = True) = True) = True then
мм... если честно, то не знаю...
разве это не тоже самое, что и:

Код HTML:
If Shag=True then
IgoRek125 вне форума Ответить с цитированием
Старый 28.04.2012, 21:58   #30
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

что тоже самое что и
Код:
 if Shag then
булева переменная уже имеет тип boolean, который требует условие.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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