Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/41: Рейтинг темы: голосов - 41, средняя оценка - 4.56
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492

sin()

31.03.2010, 18:12. Показов 8060. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно прописать функцию sin()? Что то вроде sin(LevelLeft).
Параметры LevelLeft меняется от 18 до 99 - Это звуковой сигнал от микрофона.

C++
1
2
Image1->Canvas->MoveTo(0,130);
Image1->Canvas->LineTo(msec,LevelLeft);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2010, 18:12
Ответы с готовыми решениями:

C++. Графики функций sin(x), sin(x+Pi/4), cos(x), cos(x-Pi/4)
Добрый день, задали задачу написать приложение на с++ (у нас используется borland c++ builder 6, если можно - помогите именно с этой...

Нарисовать sin
Подскажите, пожалуйста, как можно нарисовать синус на конве, не прибегая к компоненту график? Может, есть уже созданный алгоритм? Если...

sin и BCB6
Всем привет, решил побаловаться в С++, написать программу чтоби считала синус и косинус void __fastcall TForm1::Button1Click(TObject...

24
17 / 17 / 3
Регистрация: 14.10.2009
Сообщений: 82
31.03.2010, 18:50
sin имеется ввиду мат. функция синус? если да то подключи <math.h>.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
31.03.2010, 19:17  [ТС]
С #include <math.h> на функцию теперь не ругается. Но рисует по вертикали деберду. как правильно прописать код?

C++
1
2
 Image1->Canvas->MoveTo(0,550);
 Image1->Canvas->LineTo(msec,sin(LevelLeft));
0
17 / 17 / 3
Регистрация: 14.10.2009
Сообщений: 82
01.04.2010, 02:38
ты учти что функция sin() работает не с градусами, а с радианами. Если память не подводит то 1рад=~57градусов. (180/пи). отсюда смотри и переводи как надо.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
01.04.2010, 10:09  [ТС]
А вот оно что! sin() работает не с градусами, а с радианами
А как же получить синусоиду звука?
В моём нестондартном коде получается красивая картинка, но не синусоида! Не знаю как с Image1 скопировать сюда в сообщение и показать полученную картинку.

C++
1
2
Image1->Canvas->MoveTo(msec,160);
Image1->Canvas->LineTo(msec,LevelLeft+100);
0
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
01.04.2010, 10:36
Garic_, мне почему-то кажется, что LevelLeft не угол, а частота, хотя твоих проблем я не знаю.
ЕСли хочешь помощи, проясни физическую сущность задачи. И что тебе надо получить - "синусоиду звука" ? или что-то производное от частоты ?
Если моя догадка правильна, то уравнение изменения колебания от времени
X = a0 * sin((2*PI/LevelLeft)*t +alfa)
t - время, alfa-начальная фаза (рад),a0-амплитуда
И все размерности надо приводить в одну систему

Добавлено через 4 минуты
Ты задаешь вопрос так, как будто мы все уже давно решаем твою задачу.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
01.04.2010, 12:07  [ТС]
что тебе надо получить - "синусоиду звука" ? или что-то производное от частоты
Да, и то и другое: 1) в Memo1->(с pHdr->lpData[n]) )не в десятичном, а в двоичном выражении.И 2-е в Image1->синусоиду звука.
1.На сколько я понимаю для Memo1 нужно брать инфо отсюда i=(int) ((unsigned char) pHdr->lpData[n]) - 128; Но как?
2.Параметры LevelLeft меняется от 18 до 99 от силы звука, данные просматриваю в Memo1 точнее сказать немогу LevelLeft не угол, а частота или преоброзование от амплитуды, я так думаю.
3.X = a0 * sin((2*PI/LevelLeft)*t +alfa) и с a0-амплитудой не совсем тут понятно (ведь амплитуда это колебание и время)

тут более подробнее.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
bool __fastcall TForm1::DataWaveIn(HWND hWnd, HWAVEIN hwav, LPWAVEHDR pHdr)
{
PLEVELWAVEIN pInfo;
int n = 0;
int taim;
int LevelLeft = 0, LevelRight = 0;
int i, l;
 
// pick up our info from the dialog
pInfo = (PLEVELWAVEIN) GetWindowLong(hWnd, GWL_USERDATA);
 
if ((pInfo == NULL) || (pInfo->hwav != hwav))
return false;
  while (n < pInfo->buffersize)
{
  i=(int) ((unsigned char) pHdr->lpData[n]) - 128;    //Êàê ðàáîòàåò ?
  n++;
 if (i < 0)
  i = -i;
  l = (i*100) / 128;
 if (LevelLeft < l)
  LevelLeft = l;
}
 if (waveInAddBuffer(pInfo->hwav, pHdr, sizeof(WAVEHDR)))
 return false;
 SendMessage(Form1->Handle,WM_USER+1, 0, LevelLeft);
 Image1->Canvas->MoveTo(msec,160);
 Image1->Canvas->LineTo(msec,LevelLeft+100);  
 Memo1->Lines->Add(LevelLeft);
return(TRUE);
}
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
02.04.2010, 00:37
а0-максимальная амплитуда. Берешь удобное для себя значение, чтоб на экране помещалась.
ведь амплитуда это колебание и время
Амплитуда - это прямая. А амплитуда и время - график.
Синусоиду можно построить зная частоту звука. Звук с микрофона это набор частот. Если сможешь построить синусоиды от всех частот, получишь равномерно закрашенную полосу. Нужно или программно выделить частоту или использовать камертон.
Похоже программа строит амплитудно-временной график. Можешь всю скинуть?
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
02.04.2010, 01:53  [ТС]
амплитуды, ж. (латин. amplitudo - полнота) (науч.). Разность пределов, между которыми колеблется какая-н. переменная величина. Амплитуда качания маятника. Амплитуда суточного изменения температуры. И т.д.
Можешь всю скинуть? Черновик пока стыдно бросать.

Добавлено через 27 минут
Лучше подскажи как в коде прописовать F-частоту? Плз.
( Синусоиду можно построить зная частоту звука.) (построить синусоиды от всех частот)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
bool __fastcall TForm1::OpenWaveIn(HWND hWnd,int nChan,int Freq,int nBits)
{
PLEVELWAVEIN pInfo;
int i;
pInfo = new LEVELWAVEIN;
if(!pInfo)return false;
pwfx = new WAVEFORMATEX;
if(!pwfx)return false;
memset(pwfx,0,sizeof(WAVEFORMATEX));
// Çíà÷åíèÿ êîòîðûå ìîæíî çàäàâàòü â äèàëîãå
pwfx->nChannels=nChan; //1(Mono) or 2(Stereo)
pwfx->nSamplesPerSec=Freq; //8000,11025,22050,44100
pwfx->wBitsPerSample=nBits; //8 bit or 16 bit
//Çàïîëíèì ïîëÿ ñòðóêòóðû
pwfx->wFormatTag = WAVE_FORMAT_PCM;
pwfx->nBlockAlign = pwfx->nChannels * pwfx->wBitsPerSample / 8;
pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nBlockAlign;
// save for later use
pInfo->pwfx = pwfx;
// buffer size a fixed fraction of a second
pInfo->buffersize = pwfx->nAvgBytesPerSec/StrToFloat(Edit2->Text);//UPDATES_PER_SEC; // UPDATES_PER_SEC = 20                      //
pInfo->hwav = NULL;
//Óñòàíàâëèâàåì ñâÿçü ñ äðàéâåðîì
if (waveInOpen(
&pInfo->hwav,
WAVE_MAPPER,
pwfx,
(DWORD) hWnd,// callback via MM_WIM_ messages to wndproc ScrollBars ssVertical
0,
CALLBACK_WINDOW)) {
SetWindowLong(hWnd, GWL_USERDATA, 0);
return(FALSE);
}
// store the info structure in the dialog, so that even if we fail
// on this routine we will clean up correctly
SetWindowLong(hWnd, GWL_USERDATA, (long)pInfo);
// set all the wave headers to null (for cleanup if error)
for(i = 0; i < NUM_LEVEL_BUFFERS; i++)pInfo->alpWave[i] = NULL;
// alloc, prepare and add all the buffers
for (i = 0; i < NUM_LEVEL_BUFFERS; i++)
{
pInfo->alpWave[i] =(LPWAVEHDR)new char[sizeof(WAVEHDR)+pInfo->buffersize];
if (pInfo->alpWave[i] == NULL)return false;
pInfo->alpWave[i]->lpData = (LPBYTE) (pInfo->alpWave[i] + 1);
pInfo->alpWave[i]->dwBufferLength = pInfo->buffersize;
pInfo->alpWave[i]->dwBytesRecorded = 0;
pInfo->alpWave[i]->dwUser = 0;
pInfo->alpWave[i]->dwFlags = 0;
pInfo->alpWave[i]->dwLoops = 0;
 
if (waveInPrepareHeader(pInfo->hwav, pInfo->alpWave[i], sizeof(WAVEHDR)))
return false;
if (waveInAddBuffer(pInfo->hwav, pInfo->alpWave[i], sizeof(WAVEHDR)))
return false;
}
 
waveInStart(pInfo->hwav);
return true;
}
0
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
02.04.2010, 02:36
Амплитуда — Википедия
Амплиту́да — максимальное значение смещения или изменения переменной величины от среднего значения при колебательном или волновом движении.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
02.04.2010, 09:52  [ТС]
https://www.cyberforum.ru/newa... eattach&p=
Синусоиду можно построить зная частоту звука.
И как сюда можно задать f - звука?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Изменнения которые можно задавать в диологе
pwfx->nChannels=nChan; //1(Mono) or 2(Stereo)
pwfx->nSamplesPerSec=Freq; //8000,11025,22050,44100
pwfx->wBitsPerSample=nBits; //8 bit or 16 bit
//заполним поля структуры
pwfx->wFormatTag = WAVE_FORMAT_PCM;
pwfx->nBlockAlign = pwfx->nChannels * pwfx->wBitsPerSample / 8;
pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nBlockAlign;
//pwfx->cbSize
// save for later use
pInfo->pwfx = pwfx;
// buffer size a fixed fraction of a second
pInfo->buffersize = pwfx->nAvgBytesPerSec/StrToFloat(Edit2->Text);//UPDATES_PER_SEC; // UPDATES_PER_SEC = 20                      //
pInfo->hwav = NULL;
Вложения
Тип файла: rar Project1.rar (13.9 Кб, 32 просмотров)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.04.2010, 09:57
Цитата Сообщение от Garic_ Посмотреть сообщение
А как же получить синусоиду звука?
Для этого функция не нужна, так как ординату этой синусоиды сразу со всеми модуляциями поставляет микрофон.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
02.04.2010, 10:16  [ТС]
Что под этим имел ввиду Grey?
Если сможешь построить синусоиды от всех частот, получишь равномерно закрашенную полосу.
А меня заинтересовал вариант получения из нескольких ProgressBar1=4800гц,ProgressBar-n=6200гц
или
в Image не сколько разных от частот синусоид.
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
02.04.2010, 16:49
Я не знаю как программно выделить частоту. Меня твоя программа заинтересовала как низкочастотный осцилограф.

Garic_, тебе бы про акустику почитать.
Человеческий голос имеет несущую частоту f и кратные ей 2f, 3f и т.д. Каждая следующая частота по амплитуде меньше предыдущей.
Если сможешь построить синусоиды от всех частот
По X откладываешь амплитуду, а по Y период колебаний преобразованный во время или угол. Итого 2 значения.
Твоя программа берет набор частот с разной амплитудой, строит графики. Через N мсек следующий набор. И т.д. Графики накладываются друг на друга. Получаем сплошную полосу. Даже если будеш предыдущии стирать - инерционность зрения.
N выборок * N частот * N амплитут= комп не зависнет?

Добавлено через 27 минут
Хотя можно увидеть синусоиды. Частота выборок должна быть кратна главной частоте звука и голос нужен как у оперного певца (или камертон).
1
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
02.04.2010, 22:34
В папке построение 2 синусоид. Одна из Edit, другая TrackBar.
Вложения
Тип файла: zip Pgrafik.zip (777.2 Кб, 40 просмотров)
1
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
03.04.2010, 18:28
Вот здесь сказано,что разложение сигнала по частотам обычно производится с помощью быстрого преобразования Фурье.
Здесь вроде понятней.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
03.04.2010, 22:47  [ТС]
Извиняюсь технически пропал, сразу не сообразил что Utel подмял Киевстар.
Grey - про акустику почитать.
Человеческий голос имеет несущую частоту f и кратные ей 2f, 3f и т.д.
В детстве баловался радиоспортом, поял трансивера (да колеги меня поймут) с гармоникой сталкивался и с несущей. (б/к)!!!

быстрого преобразования Фурье.
Всегда с удовольствием еще прочитаю.
Книжка класная Тим Кинцель программирование звука на пк, и о Фурье понятно описано, ею пользовался.
Code
1
2
3
1 В начале было Слово, и Слово было с Богом, и Слово было богом.
 2 Оно было в начале с Богом. 3 Всё появилось через него,
 и без него ничто не появилось. Иоанна 1:1
Это я так на указанную мне страничку http://offline.computerra.ru/1999/293/3577/
Меня твоя программа заинтересовала как низкочастотный осцилограф
Давай логин свой.

Добавлено через 21 минуту
если будеш предыдущии стирать - инерционность зрения.
N выборок * N частот * N амплитут= комп не зависнет?
Да я хочу не стирать, а вот знает кто как в Image1 Scrollbars ssHorizontal сделать?
1
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
04.04.2010, 22:08
Имаге 200*200
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Graphics::TBitmap*b=new Graphics::TBitmap();
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int h1,w1,w2;
b->LoadFromFile("test.bmp");
h1=b->Height;
w1=b->Width;
Edit1->Text=("h="+IntToStr(h1)+",w="+IntToStr(w1));
w2=200;
ScrollBar1->Max=w1-w2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender,
      TScrollCode ScrollCode, int &ScrollPos)
{
int p=ScrollBar1->Position;
Image1->Canvas->CopyMode=cmSrcCopy;
Image1->Canvas->CopyRect(Rect(0,0,200,200),b->Canvas,Rect(p,0,p+200,200));
}
В какойто теме ещё советовали использовать ScrollBox. незнаю как туда картинку вставлять.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
05.04.2010, 02:36  [ТС]
А так нельзя, что то вроде?
Code
1
2
h1=Image1->Height;
w1=Image1->Width;
не картинку с *.BMP, а Image1 прокручивать, просмотреть результат удлинёной синусоиды.
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
05.04.2010, 17:39
Цитата Сообщение от Garic_ Посмотреть сообщение
просмотреть результат удлинёной синусоиды.
Я так и подумал.
Помойму имаге обрезает картинку. Рисуй в Bitmat'e а потом выводи нужный участок. И мелькает меньше.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2010, 17:39
Помогаю со студенческими работами здесь

Нарисовать касательную к графику y=sin(x)
нужно нарисовать касательную к sin(x) вот код к графику sin(x) for(x=-50;x&lt;=50;x++) {y=sin(x/10); ...

Построить график сигнала вида x=sin(t)
Как сделать, идей нет :(

Вычисление значений функций cos, sin, tg, ctg
Как сделать,чтобы программа считала cos,sin,tg,ctg??? Вот код моей программы-на данном этапе считаются операции +,-,*,/ ПОМОГИТЕ...

Канва, график функции sin(x) в модуле в первом и втором квадрантах
Всем привет. Такая проблема, нужно построить график функции sin(x) в модуле в первом и втором квадрантах. Как это сделать...

Как распознать математическую функцию cos, sin с ячейки StringGrid?
Возникла такая проблема. Например в какой - то ячейке StringGrid написано cos(60), как мне именно распознать его не как текст, а как мат....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru