3.3 Реализация функции распознавания голосовых команд голосового управления промышленным роботом
Для реализации функции распознавания голосовых команд голосового управления промышленным роботом была создана функция OpenData. После того, как данные о записанной информации занесены в массив, функция вызывает функции, отвечающие за преобразование этого массива. Прежде всего, вызывается функция Noise, которая на основании разделения вокализованного звука и невокализованного переписывает массив с данными о звуке в новый массив, содержащий лишь участки вокализованного звука.
После этого проводится обработка в окне Хэмминга. График полученный в результате этого преобразования приведен на рис 3.3.
Рисунок 3.3 – График функции, после обработки в окне Хэмминга
Далее выполняется преобразование Фурье для коэффициентов, взвешенных окном Хэмминга После этого производится фильтрация. Затем проводится обратное преобразование Фурье. Далее следует операция клигширования, на основании графика которой делается вывод о том, какое слово было произнесено. На рис. 3.4 приведены графики сигнала для слова «вперёд».
Рисунок 3.5 - Графики сигнала для слова «назад» (а - график вокализованной части сигнала; б - график сигнала после обработки в окне Хэмминга; в -график сигнала после клиппирования)
На рис. 3.6 приведены графики сигнала для слова «стоп».
Рисунок 3.6 – Графики сигнала для слова «стоп» (а - график вокализованной части сигнала; б - график сигнала после обработки в окне Хэмминга; в -график сигнала после клиппирования)
На рис. 3.11 приведены графики сигнала для слова «пять».
Рисунок 3.11 – Графики сигнала для слова «пять» (а - график вокализованной части сигнала; б - график сигнала после обработки в окне Хэмминга; в - график сигнала после клиппирования)
Недостатком предложенного метода распознавания слова является необучаемость программы, отнесение всех произнесенных слов к какому-то из заложенных в программе, а также невозможность настройки в конкретном помещении без специалиста. К достоинствам программы можно отнести независимость программы от диктора, кроме случаев дефекта дикции.
3.4 Реализация голосового управления трёхмерными моделями промышленного робота
Библиотека OpenGL представляет собой интерфейс программирования трехмерной графики - это её основное предназначение. Библиотека представляет собой программный интерфейс для аппаратного обеспечения машинной графики. Этот интерфейс состоит приблизительно из 250 отдельных команд (почти 200 команд в ядре OpenGL и еще 50 команд в библиотеке утилит OpenGL), которые используются для того, чтобы определить объекты и операции, необходимые для создания интерактивных трехмерных прикладных программ.
Единицей информации является вершина, из них состоят более сложные объекты. При создании заданной модели необходимо создать вершины, указать, как их соединять (линиями или многоугольниками), установить координаты и параметры камеры и ламп, а библиотека OpenGL создает изображения на экране [16].
Исходя из вышеуказанных причин было принято решение реализовать моделирование функционирования промышленного робота с помощью средств библиотеки OpenGL.
Для создания требуемой модели робота используются различные трехмерные объекты. Каждая трехмерная модель имеет две разновидности: каркас (wireframe) без поверхностных нормалей и объемная модель (solid) с закраской и поверхностными нормалями. При создании программного обеспечения использовались каркасные модели.
Преобразование вида и моделирование сложно связаны в OpenGL и в действительности объединены в одну матрицу видового преобразования (modelview matrix). Существуют три подпрограммы OpenGL для преобразований модели: glTranslate(), glRotate(), glScale(). Эти подпрограммы выполняют преобразование объекта (или системы координат) с помощью его параллельного переноса (moving), поворота (rotating), растягивания (stretching), сжатия (shrinking) или зеркального отражения (reflecting). Все три команды эквивалентны созданию соответствующей матрицы параллельного переноса (translation), поворота (rotation) или
масштабирования {scaling), а затем вызову команды glMultMatrixQ с этой матрицей в качестве аргумента. Однако использование этих трех подпрограмм должно быть быстрее использования команды glMultMatrixQ. OpenGL автоматически вычисляет эти матрицы для пользователя [17].
Все преобразования в программе осуществлены с помощью указанных подпрограмм.
Ниже приведена функция, обеспечивающая моделирование функционирования промышленного робота.
void CMain::OnOpenGLFirst()
{glPushMatrixQ;
glTranslatef(k*per,-3.0,0.0);
glRotatef(360.0* vspos/100,0,1,0);
glRotatef(l 80,0,0,1);
glLineWidth(2.0);
glPushMatrix();
glRotatef(90.0,1.0,0.0,0.0);
glColor3f(0.0,0.0,1.0);
auxWireCone(1.5,1.0);
glPopMatrix();
glTranslatef(0.0,-l.0,0.0);
glColor3f(0.0,0.5,0.5);
auxWireCylinder(0.6,4.0);
glPushMatrix();
glTranslatef(0.0,-3.0,0.0);
glRotatef(90.0,1.0,0.0,0.0);
glColor3f(l.0,0.0,0.0);
auxWireCylinder(0.6,2.0);
glRotatef(180.0*hspos/100,0.0,1.0,0.0);
glTranslatef(l.0,0.5,0.0); (3.3)
Прежде всего, перемещаем сцену. Далее задаём вращение вокруг оси ъ. Задаём переменную, которая будет обеспечивать перемещение робота согласно голосовым командам. Запоминаем положение основы робота. Строим его основу – конус, поднимаемся к его вершине. Строим колонну робота и перемещаемся к её вершине, поворачиваемся на 90 градусов относительно оси х. Строим цилиндр – крепление плеча. Задаём движение
плеча горизонтальной прокруткой. Перемещаемся в конец крепления плеча и создаём плечо –- строим призму. Перемещаемся к её концу, поворачиваемся на 90 градусов и создаём цилиндр – локоть. Далее после перемещения к концу этого цилиндра строим призму – основание схвата, поворачиваемся на 90 градусов и строим первый и второй пальцы.
Результат моделирования робота приведен на рис. 3.1
Рисунок 3.1 Результат моделирования функционирования промышленного робота
Выводы
Организация управления промышленными роботами (ПР) продолжает оставаться актуальной задачей робототехники. Управление роботами реализуется различными способами. К ним относятся: управление при помощи пультов ручного управления, командное управление от управляющих компьютеров, дистанционное управление при помощи внешних вычислительных систем. С точки зрения повышения эффективности обучения ПР одним из наиболее перспективных способов является голосовое управление.
Во время написания магистерской аттестационной работы были проанализированы методы цифровой обработки звуковых сигналов и их использование в системах распознавания речи, выполнен анализ цифровой фильтрации и особенностей акустической фонетики и её учёт при обработке цифровых сигналов.
В работе рассмотрены гомоморфная обработка речи, кодирование речи на основе линейного предсказания и цифровая её обработка в системах речевого общения человека с машиной, особенности различных систем распознавания речи.
Первоначальной задачей являлось создание интерфейса записи и воспроизведения звукового сигнала. Это было выполнено с использованием встроенной библиотеки mmsystem операционной системы Windows. Далее были добавлены функции, обеспечивающие обработку записанного сигнала: выделение вокализованных участков речи, взвешивание коэффициентов дискретного сигнала с помощью окна Хэмминга, преобразование Фурье, фильтрация, обратное преобразование Фурье, а также клиппирование и вычисление кепстра.
На основании проведенного анализа сигнала создана функция распознавания слова-команды. При помощи графической библиотеки OpenGL была обеспечена визуализация выполнения трёхмерной моделью ПР
распознанной голосовой команды. Применение библиотеки OpenGL позволяет моделировать любой из как уже существующих, так и разрабатываемых видов ПР.
Сложность решаемой задачи обуславливалась тем, что даже один и тот же человек не может два раза произнести одно и то же слово абсолютно одинаково и возникает разница в скорости произнесения слова и амплитуде звукового смгнала. При этом возникает необходимость выделения зависимости фонем (сочетания элементарных звуков), присущих одному слову, а потом описания этих зависимостей в виде, понятном для распознавания. Выделение этих зависимостей - является достаточно сложно реализуемой задачей.
Основным достоинством программы является её независимость от оператора: при условиях достаточно чёткого произношения команды, пол и возраст диктора не имеет влияния на распознавание слова. Её применение целесообразно для адаптации промышленного робота к условиям производственной среды, а также для создания информационного потока управления роботом. Возможными перспективами улучшения программы являются увеличение словаря, добавление возможности обучения и улучшение гибкости цифрового представления звукового сигнала.
Перечень ссылок
1. Рабинер Л. Р., Шафер Р. В. Цифровая обработка речевых сигналов: Пер. с англ./Под ред. М. В. Назарова и Ю. Н. Прохорова. - М.: Радио и связь, 1981.-496 с.
2. Рабинер Л. Р., Гоулд Б. Теория и применение цифровой обработки сигналов: Пер. с англ./Под ред. Александрова Ю. Н. - М.: Мир, 1978. -848 с.
3. А. V. Oppenhehn and R. W. Schafer, Digital Signal Processing,, Prentice-Hall, Inc., Englewood Cliffs, N.J., 1975. - 436 p.
4. A. Peled and B. Liu, Digital Signal Processing. Theory, Design and Implementation, John Wiley and Sons.New York, 1976. - 675 p.
5. J. W. Cooley and J. W. Tukey, "An Algorithm for the Machine Computation of Complex Fourier.Series," Math Computation, Vol. 19, 1965. - 452 p.
6. Бондарев В. H., Трёстер Г., Чернега В. С. Цифровая обработка сигналов: методы и средства. Учеб. Пособие для вузов. 2-е изд. - X.: Конус, 2001. -398 с.
7. Марпл С. Л. Цифровой спектральный анализ и его приложения. - М.: Мир, 1990.-584 с.
8. Бендат Дж., Пирсол А. Применения корреляционного и спектрального анализа. -М.: Мир, 1983. -312 с.
9. Гольденберг Л. М., Матюшкин Б. Д., Поляк М. Н. Цифровая обработка сигналов: Справочник. -М.: Радио и связь, 1985. - 312 с.
10. Гутников В. С. Фильтрация измерительных сигналов. - Л.: Энергоатомиздат, Ленингр. отд-ние, 1990. - 192 с.
11. J. Н. McClellan, Т. W. Parks, and L. R. Rabiner, "A Computer Program for Designing Optimum FIR Linear Phase Digital Filters," IEEE Trans. Audio and Electro acoustics, Vol. AU-21, 1973. - 347 p.
12. Цифровые фильтры в электросвязи и радиотехнике/ А. В. Брунченко, Ю.Г. Бутыльский, Л. М. Гольденберг и др.: под ред. Л. М. Гольденберга.
- M.: радио и связь, 1982. - 224 с.
13. J. L. Ftanagan, С. H. Coker, L. R. Rabiner, R. W. Schafer, and N. Umeda, "Synthetic Voices for Computers," IEEE Spectrum, Vol. 7, No. 10, October 1970.-536 p.
14. MFC и Visual С++. Энциклопедия программиста: Пер. с англ./ Юджин Олафсен, Кенн Скрайбнер, К. Дэвид Уайт и др. - СПб.: ООО «ДиаСофтЮП», 2004. - 992с.
15. Шилдт Герберт. MFC: основы программирования. - К.: Издательская группа BHV, 1997. - 560 с.
16. Тихомиров Ю.В. OpenGL. Программирование трехмерной графики. -СПб.: БХВ-Петербург, 2002.-304 с.
17. OpenGL. Официальное руководство программиста: Пер. с англ. / Мейсон By, Джеки Нейдер, Том Девис, Дейв Шрайнер. - СПб: ООО «ДиаСофтЮП», 2002. - 592 с.
Приложение А. Элементы текстов программного кода
// recorddlh: header file class CRecordDlg;
class CRecDlgNotifyObj: public CWaveNotifyObj {public:
CRecDlgNotifyObjO; -CRecDlgNotifyObjO; void Attach(CRecordDlg* pDlg) {m_pDlg = pDlg;}
virtual void NewData(CWave *pWave, CWaveBIock* pBlock);
virtual void EndPlayback(CWave *pWave);
CRecordDlg* m_pDlg;};
class CFilterDlg. public CDialog
{public. CWaveOutDevice* m_pOutDev;
CFilterDlg(CWnd* pParent = NULL);
enum { IDD = IDD_FILTERDLG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); protected:
afxmsg void OnFilter(); DECLAREMESSAGEMAPOJ; class CRecordDlg: public CDialog {public:
CRecordDlg(CWnd* pParent = NULL); ~CRecordDlg();
void NewData(CWave *pWave, CWaveBIock* pBlock);
void EndPlayback(CWave *pWave);
enum { IDD = IDD_RECORDDLG };
CButtonmbtnOpenData;
CComboBox mcbSource;
CComboBox mcbFormat;
CStatic mwndFrame;
CButton mbtnPause;
CButton mbtnPlay;
CButton mbtnRecord;
CButton mbtnOK;
CButton mbtnStop;
CString mstrFormat;
CString m_strSource;
public:
void UDdatdTJClientDC *curDC>:
CFilterDIg* m_pFUter; CWave* m_pWave; private:
enum MODE {IDLE, SAMPLING,PLAYTNG,RECORDING,OPEN };
CVUMeter m_VU;
int mJNumDevs;
WAVEINCAPS* m_pDevCaps;
CWavelnDevice mlnDev;
CWave mSampleWave;
CRecDlgNotifyObj m_NotifyObj;
int mJMode;
void FillDeviceList();
void FillFormatListQ;
void SetMode(MODE m);
void BuildFormat(PCMWAVEFORMAT& fmt, DWORD dwFormat); protected:
virtual void DoDataExchange(CDataExchange* pDX);
virtual BOOL OnlnitDialogO;
afxmsg void OnSelchangeFormat();
afxmsg void OnClickedPlay();
afxjmsg void OnClickedRecordO;
afxmsg void OnClickedStop();
afxmsg void OnSelchangeSource();
virtual void OnCancel();
virtual void OnOK();
afxmsg void OnDrawItem(int nlDCtl, LPDRAW1TEMSTRUCT IpDrawItemStruct); afxmsg void OnMeasureItem(int rJDCtl, LPMEASUREITEMSTRUCT IpMeasureltemStruct); afxmsg void OnClickedOpenData(); afxmsg void OnUpdate();
afxmsg void OnHScroll(UTNT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnGraphicQ;
afxmsg void OnHamming();
afxmsg void OnFilterQ;
afxmsg void OnFurjeQ;
afx_msg void OnObrfurje();
afxmsg void OnClip();
DECLARE_MESSAGE_MAP()};
class CGraphicDlg: public CDialog
{public:
CWaveOutDevice* mjOutDev; CGraphicDlg(CWnd* pParent = NULL); enum { IDD = IDD GRAPHIC };
protected:
virtual void DoDataExchange(CDataExchange* pDX); protected:
afxmsg void OnGraphicQ; DECLAREMESS AGE_MAP()}; class CHammingDlg: public CDialog {public:
CWaveOutDevice* m_pOutDev; CHammingDlg(CWnd* pParent = NULL); enum {IDD = IDD HAMMING }; protected:
virtual void DoDataExchange(CDataExchange* pDX); protected:
afxmsg void OnHammingO; DECLAREMESSAGEMAPO); class CFurjeDlg. public CDialog {public:
CWaveOutDevice* m_pOutDev; CFurjeDlg(CWnd* pParent = NULL); enum {IDD = IDDFURJE }; protected:
virtual void DoDataExchange(CDataExchange* pDX); protected:
afxmsg void OnFurjeO; DECLAREMESSAGEMAPO}; class CObrFurjeDlg: public CDialog {public:
CWaveOutDevice* m_pOutDev; CObrFurjeDlg(CWnd* pParent = NULL); enum { IDD = IDD OBRFURJE }; protected:
virtual void DoDataExchange(CDataExchange* pDX); protected:
afxmsg void OnObrfurje(); DECLAREMESSAGEMAPO}; class CClipDlg. public CDialog {public:
CWaveOutDevice* m_pOutDev; CClipDlg(CWnd* pParent = NULL); enum { IDD = EDDCLIP }; protected:
virtual void DoDataExchange(CDataExchange* pDX);
ON_BN_CLICKED(IDC_GRAPHIC, OnGraphic) ON_BN_CLICKED(IDC_HAMMrNG, OnHamming) ON_BN_CLICKED(IDC_FILTER OnFilter) ON_BN_CLICKED(IDC_FURJE, OnFurje) ON_BN_CLICKED(IDC_OBRFURJE, OnObrfurje) ON_BN_CLICKED(IDC_CLIP, OnClip) END_MESSAGE_MAP() BOOL CRecordDlg::OnInitDialog() {CDialog::OnInitDialog(); ASSERT(mjpWave = NULL); CRect rcVU;
m_wndFrame.GetWindowRect(&rcVU); ScreenToClient(&rcVU);
m_VU.Create(nVU",WS_CHILD | WS_VISIBLE,rcVU,this,l);
m_VU.SetValue(0> 0);
FillDeviceListQ;
FillFormatListO;
SetMode(SAMPLLNG);
return TRUE; }
void CRecordDlg::OnSelchangeFormatO
{OnClickedStopO;}
void CRecordDlg::OnClickedPIayO
{SetMode(PLAYING);
CClientDCdc(this);}
void CRecordDlg. OnClickedRecordO
{ SetMode(RECORDLNG);}
void CRecordDlg. OnClickedStopO
{SetMode(S AMPLING);}
void CRecordDlg::OnSelchangeSource()
{OnClickedStopO;
FillFormatListO;}
void CRecordDlg::OnCancelO
{ OnClickedStopO;
SetMode(IDLE);
mVU.DestroyWindowO;
if (m_pWave) {delete m_pWave;
m_pWave = NULL;}
CDialog::OnCancel();}
void CRecordDlg. OnOKO
{ OnClickedStopO;
SetMode(IDLE);
mVU.DestroyWindowO;
CDialog::OnOK();}
void CRecordDlg::FillDeviceList()
{miNumDevs = wavelnGetNumDevsO;
if (miNumDevs == 0) {
AfxMessageBox("There are no suitable input devices");
EndDialog(IDCANCEL);
return;}
if (m_pDevCaps) delete m_pDevCaps;
m_pDevCaps = new WAVEINCAPSfmiNumDevs];
m_cbSource.ResetContent();
for (int i=0; KmiNumDevs; i++) {
waveInGetDevCaps(i,&m_pDevCaps[i],sizeof(WAVEINCAPS)); m_pDevCaps[i].wMid = i;
m_cbSource.AddString((LPCSTR)&m_pDevCaps[i]);}
mcbSource. SetCurSel(0);}
void CRecordDlg.:FillFormatList()
{ mcbFormat.ResetContentO;
int iSel = m_cbSource.GetCurSel();
if(iSel = CBERR) return;
WAVEINCAPS* pCaps = (WAVEINCAPS*) m_cbSource.GetItemData(iSel);
ASSERT(pCaps);
DWORD dwMask = 0x00000001;
for(inti=0; i<12; i++) {
if (pCaps->dwFormats & dwMask) {
m_cbFormat.AddString((LPCSTR)dwMask);}
dwMask = dwMask « 1; }
mcbFormat. SetCurSel(O);}
void CRecordDlg.OnDrawItem(int nlDCtl, LPDRAWITEMSTRUCT pDI) {char* pszText = NULL; switch (nlDCtl) { case IDC_SOURCE: {
WAVEINCAPS* pCaps = (WAVEINCAPS*)(pDI->itemData); pszText = pCaps->szPname; } break;
case IDC FORMAT: { switch(pDI->itemData) { case WAVE_FORMAT_1M08: pszText = "11.025 kHz, 8 bit, mono"; break;
case WAVE_FORMAT_1S08: pszText = "11.025 kHz, 8 bit, stereo"; break;
case WAVE_FORMAT_lM16: pszText = "11.025 kHz, 16 bit, mono"; break;
case WAVE_F0RMAT_1S16. pszText = "22.05 kHz, 16 bit, stereo"; break;
case WAVE_FORMAT_2M08: pszText = "22.05 kHz, 8 bit, mono"; break;
case WAVE_FORMAT_2S08: pszText = "22.05 kHz, 8 bit, stereo"; break;
case WAVE_FORMAT_2M16: pszText = "22.05 kHz, 16 bit, mono"; break;
case WAVEJFORMATJ2S16. pszText = "22.05 kHz, 16 bit, stereo"; break;
case WAVEJ?ORMAT_4M08: pszText = "44.1 kHz, 8 bit, mono"; break;
case WAVE_FORMAT_4S08: pszText = "44.1 kHz, 8 bit, stereo"; break;
case WAVE_FORMAT_4M16: pszText = "44.1 kHz, 16 bit, mono"; break;
case WAVE_FORMAT_4S16:
pszText = "44.1 kHz, 16 bit, stereo";
break; default:
pszText = "Unknown";
break;} } break; default:
break;} if (IpszText) return;
: ^rawTextCpDI^hDC^szText.-L&CpDI^rcItem), DTLEFT | DTVCENTER); if (pDI->itemState & ODSSELECTED) {
::InvertRect(pDI->hDC, &(pDI->rcItem));} if (PDI->itemState & ODS_FOCUS) {
::DrawFocusRect(pDI->hDC, &(pDI->rdtem)); }}
void CRecordDlg::OnMeasureItem(int ruDCtl, LPMEASUREITEMSTRUCT lpMeasureltemStruct) { CClientDC dc (this);
TEXTMETRIC tm;
dc. GetTextMetrics(&tm);
lpMeasureItemStruct->itemHeight = tm.tmHeight;} void CRecordDlg::SetMode(MODE m) { CClientDC dc(this); if (m = miMode) return; if (m_pWave) m_pWave->Stop(); switch (miMode) {case SAMPLING: case RECORDING: mlnDev.ResetO; m_InDev.Close(); break; case PLAYING: break;
case OPEN:
break;}
miMode = IDLE;
switch (m) {case SAMPLING:
f case RECORDING.
{int iSel = m_cbSource.GetCurSel(); if(iSel = CBERR) return;
WAVEINCAPS* pCaps = (WAVEINCAPS*) m_cbSource.GetItemData(iSeI);
ASSERT(pCaps);
UINT uiBD = pCaps->wMid;
iSel = m_cbFormat.GetCurSel();
if(iSel == CBERR) return;
DWORD dwFormat = mcbFormat.GetltemData(iSel);
ASSERT(dwFormat);
PCMWAVEFORMAT fmt;
BuildFormat(fmt, dwFormat);
if (!m_InDev.Open(uiID, &fmt)) return;
if (m = SAMPLING) {
mSampleWave.DeleteAllO;
mSampleWave. Create(&frnt);
m_SampleWave.Record(&m_InDev, 1024,&m_NotifyObj); } else if (m — RECORDING) { if (!m_pWave) m_pWave = new CWave; ASSERT(m_pWave); mjpWave->Create(&fmt);
m_pWave->Record(&mJnDev,4096,&m_NotifyObj);}
case PLAYING, if (m_pWave) m_pWave->Play(NULL, &m_NotifyObj); break;
case OPEN.
if (m_pWave) m_pWave->OpenData(NULL, &m_NotifyObj,&dc); break;} miMode = m,
if ((mjMode = PLAYING) || (mjMode = RECORDING)! |(m_iMode btnStop.EnableWindow(TRUE);
} else {m_btnStop.EnableWindow(FALSE);}
if (mjMode = PLAYING) { m_btnPlay.EnableWindow(FALSE); } else {mbtnPlay.EnableWindow(TRUE);}
if (m_iMode = OPEN) {mbtnOpenData.EnableWindow(FALSE); } else {mbtnOpenData.EnableWindow(TRUE);} if (mjMode = RECORDING) {m_btnRecord.EnableWindow(FALSE); } else {m_btnRecord.EnableWindow(TRUE);}} void CRecordDlg::NewData(CWave *pWave, CWaveBlock* pBlock) { ASSERT(pWave); ASSERT(pBlock);
PCMWAVEFORMAT* pwf = (PCMWAVEFORMAT*) pWave->GetFormat(); ASSERT(pwf->wf.wFormatTag = WAVEFORMATPCM); int iCount = pBlock->GefNumSamples(); if (pwf->wBitsPerSample = 8) {
BYTE* pData = (BYTE*)pBlock->GetSamplesO; BYTE bMax - 0; while (iCount—) {
if (*pData > bMax) bMax = *pData; pData++;}
if (bMax < 128) { bMax = 0;} else {bMax -= 128;} m_VU.SetValue(bMax « 8, bMax « 8); } else {ASSERT(sizeof(short int) = 2); short int* pData = (short int*) pBlock->GetSamples(); int iMax = 0;
while (iCount—) {if (*pData > iMax) iMax = *pData;
pData++;} m_VU.SetValue(iMax, iMax);} if(m_iMode!= RECORDING) { pWave->GetBlockList()->FreeAll();}} void CRecordDlg::EndPlayback(CWave *pWave) { ASSERT(pWave); SetMode(SAMPLjrNG);}
void CRecordDlg::BuildFormat(PCMWAVEFORMAT& fmt, DWORD dwFormat) { ASSERT(dwFormat); fmt.wf.wFormatTag = WAVEFORMATPCM; switch (dwFormat) { case WAVE_FORMAT_1M08: fmt.wf.nChannels = 1; rmtwf.nSamplesPerSec = 11025; fmtwBitsPerSample = 8; break;
case WAVE_F0RMAT_1M16: fmt.wf.nChannels = 1; fmt.wf.nSamplesPerSec = 11025; fmt.wBitsPerSample = 16; break;
case WAVE_FORMAT_1S08: fmt.wf.nChannels = 2; fmt.wf.nSamplesPerSec = 11025; fmt.wBitsPerSample = 8; break;
case WAVE_F0RMAT_1S16: fmt.wf.nChannels = 2; fmtwf.nSamplesPerSec = 11025; fmt.wBitsPerSample = 16; break;
case WAVE_FORMAT_2M08: fmt.wf.nChannels = 1; fmt.wf.nSamplesPerSec = 22050; fmt.wBitsPerSample = 8; break;
case WAVE FORMAT 2M16 fmt.wf.nChannels = 1; fmt.wf.nSamplesPerSec = 22050; fmt.wBitsPerSample = 16; break;
case WAVE_FORMAT_2S08: fmt.wf.nChannels = 2; fmt.wf.nSamplesPerSec = 22050; fmt.wBitsPerSample = 8; break;
case WAVE_FORMAT_2S16: fmt.wfnChannels = 2; fmt.wf.nSamplesPerSec = 22050;
fmt.wBitsPerSatnple = 16; break;
case WAVE_FORMAT_4M08: fmt.wf.nChannels = 1; fmt.wf. nSamplesPerSec = 44100; fmt.wBitsPerSampIe = 8; break;
case WAVE_FORMAT_4M16: fmt.wf.nChannels = 1; fmt.wf.nSamplesPerSec = 44100; fmt.wBitsPerSampIe = 16; break;
case WAVE_FORMAT_4S08. fmt.wf.nChannels = 2; fmt.wf.nSamplesPerSec = 44100; fmt.wBitsPerSampIe = 8; break;
case WAVE_FORMAT_4S 16:
fmt.wf.nChannels = 2;
fmt.wf.nSamplesPerSec = 44100;
fmtwBitsPerSample = 16;
break; default:
ASSERT(O);
return;}
fmt.wf.nAvgBytesPerSec = fmt.wf.nSamplesPerSec;
fmt.wf.nBlockAlign = fmt.wBitsPerSampIe /8;} CRecDlgNotifyObj::CRecDlgNotifyObj() { m_pDlg = NULL;} CRecDlgNotifyObj.:~CRecDlgNotifyObj() {}
void CRecDlgNotifyObj::NewData(CWave *pWave,CWaveBlock* pBlock) { ASSERT(m_pDlg);
m_pDlg->NewData(pWave, pBlock);} void CRecDlgNotifyObj::EndPlayback(CWave *pWave) { ASSERT(m_pDlg);
m_pDlg->EndPlayback(pWave);}
void CRecordDlg.:OnClickedOpenData0
{ SetMode(OPEN);
CClientDC dc(this);} CFilterDlg::CFilterDlg(CWnd* pParent /*=NULL*/): CDialog(CFilterDlg::IDD, pParent)
void CFilterDlg::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CFilterDlg, CDialog)
ONJBN_CLICKED(IDC_FILTER, OnFilter) ENDMES S AGEM AP() void CFiIterDlg::OnFilterO (CCIientDC dc(this);
dc.SelectObject(GetStockObject(WHITE_PEN));
for(inti=0; i<110;i++)
{ dc.MoveTo(lO*i,0);
dc.LineTo(10*i,800);
dc.MoveTo(0,10*i);
dc.LineTo(1100,10*i);} dc.SelectObject(GetStockObject(BLACK_PEN)); dc.MoveTo(0,200); dc.LineTo(l 100,200); m_pOutDev->ShowFilter(&dc);}
void CRecordDlg::OnUpdate{) { CCIientDC dc(this); Update(&dc);}
void CRecordDlg::Update(CClientDC *curDC) (CWnd *win= curDC->GetWindowO; win->Invalidate(TRUE);}
int hspos=0; int curpos=0;
void CRecordDlg::OnHScroll(UTNT nSBCode, UINT nPos, CScrollBar* pScrollBar) { curpos=hspos;
switch (nSBCode) { case SBJLEFT:.
if(hspos>0)
hspos--;
break;
case SBRIGHT: hspos++;
break;
case SBLINELEFT: if(hspos>0) hspos--;
case SBLINEPJGHT: hspos++;
break;
case SBTHUMBPOSITION: hspos = nPos;
break;
case SBTFTUMBTRACK: hspos = nPos; break;
case SBPAGELEFT: if(hspos>0) hspos—;
break;
case SBPAGERIGHT.
hspos++;
break;}
CREATESTRUCT cs;
cs.cx =::GetSystemMetrics(SM_CXSCREEN);
SetScrollPos(SB_HORZ,hspos,TRUE);
curpos=hspos-curpos;
Scroll Window(-curpos* 10,0,NULL,NULL); CDialog::OnHScroll(nSBCode, nPos, pScrollBar);} CGraphicDlg::CGraphicDlg(CWnd* pParent /*=NULL*/): CDialog(CGraphicDlg::IDD, pParent)
(}
void CGraphicDlg..DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX);} BEGLN_MESSAGE_MAP(CGraphicDlg, CDialog)
ON_BN_CLICKED(IDC_GRAPHIC, OnGraphic) END MESSAGEJVIAP() void CRecordDlg::OnGraphicO (CGraphicDlg* a; a = new CGraphicDlgO; if(a!= NULL)
{ BOOL ret = a->Create(IDD_GRAPHIC,this); if(!ret)
AfxMessageBox("Error creating Dialog"); a->ShowWindow(S W_SHOW);} else AfxMessageBox("Error Creating Dialog Object");} void CGraphicDlg..OnGraphicQ
{ CClientDC dc(this);
dc.SelectObject(GetStockObject(WHITE_PEN));
for(int i=0; i<110;i++)
{ dc.MoveTo(10*i,0);
dc.LineTo(10*i,800);
dc.MoveTo(0,10*i);
dc.LineTo(1100,10*i);} dc.SelectObject(GetStockObject(BLACK_PEN)); dc.MoveTo(0,200); dc.LineTo(1100,200); m_pOutDev->Graphic(&dc);} CHammingDlg:.CHammingDlg(CWnd* pParent /*=NULL*/): CDialog(CHammingDlg::IDD, pParent)
0
void CHammingDlg.:DoDataExchange(CDataExchange* pDX)
{ CDialog.:DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CHarnmingDlg, CDialog)
ON_BN_CLICKED(IDC_HAMMING, OnHamming) END_MESSAGE_MAP() void CRecordDlg::OnHamming() {CHammingDlg* a; a = new CHammingDlgO; if(a!=NULL)
{ BOOL ret = a->Create(roDJHAMMING,this);
ifTJret) ArxMessageBox("Error creating Dialog");
a->ShowWindow(SW_SHOW); } else AfxMessageBox("Error Creating Dialog Object");}
void CHammingDlg::OnHamming() (CClientDC dc(this);
dc.SelectObject(GetStockObject(WHITE_PEN));
for(inti=0; i<110;i-H-)
{ dc.MoveTo(10*i,0);
dc.LineTo(10*i,800); dc.MoveTo(0,10*i); dc.LineTo(l 100,10*i); } dc.SelectObject(GetStockObject(BLACK_PEN)); dc.MoveTo(0,250); dc.LineTo(l 100,250); m_pOutDev->ShowHamming(&dc);} void CRecordDlg::OnFilter() {CFilterDlg* a;
a = new CFilterDlg(); if(a!=NULL)
{ BOOL ret = a->Create(TDDJFILTER,this);
if(!ret) AfxMessageBox("Error creating Dialog");
a->ShowWindow(SW_SHOW);} else
AfxMessageBox("Error Creating Dialog Object");} CFurjeDlg::CFurjeDlg(CWnd* pParent /*=NULL*/): CDialog(CFurjeDlg::TDD, pParent)
{}
void CFurjeDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX);} BEGIN_MESSAGE_MAP(CFurjeDlg, CDialog)
ON_BN_CLICJQED(IDC_FURJE, OnFurje) ENDMESSAGEMAPQ
void CRecordDlg::OnFurje() {CFurjeDlg* a; a = new CFurjeDlgQ; if(a!=NULL)
{ BOOL ret = a->Create(lDD_FURJE,this); if(!ret) AfxMessageBox("Error creating Dialog");
a->ShowWindow(SW_SHOW); } else AfxMessageBox("Error Creating Dialog Object");} void CFurjeDlg::OnFurje() {CClientDC dc(this);
dc.SelectObject(GetStockObjectOVHITE_PEN));
for(inti=0; i<110;i++)
{ dc.MoveTo(10*i,0);
dc.LineTo(10*i,800);
dc.MoveTo(0,10*i);
dc.LineTo(1100,10*i); } dc.SelectObject(GetStockObject(BLACK_PEN)); dc.MoveTo(0,250); dc.LineTo(l 100,250); m jpOutDev->ShowFurje(&dc);} CObrFurjeDlg::CObrFurjeDlg(CWnd* pParent /*=NULL*/): CDialog(CObrFurjeDlg::IDD, pParent)
{}
void CObrFurjeDlg.:DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX);}
BEGINMESS AGEM AP(CObrFurj eDlg, CDialog)
ON_BN_CLICBCED(IDC_OBRJFURJE, OnObrfurje) END_MESSAGE_MAP() void CRecordT>lg::OnObrfurje() {CObrFurjeDlg* a; a = new CObrFurjeDlg(); if(a!=NULL)
{ BOOL ret = a->Create(IDD_OBRFURJE,this);
if(!ret) AfxMessageBox("Error creating Dialog");
a->ShowWindow(SW_SHOW); } else
AfkMessageBox("Error Creating Dialog Object");} void CObrFurjeDlg::OnObrfurje() {CClientDC dc(this);
dc.SelectObject(GetStockObject(WHITE_PEN));
for(int i=0; i<l 10;i++)
{ dc.MoveTo(10*i,0);
dc.LineTo(10*i,800);
dc.MoveTo(0,10*i);
dc.LineTo(1100,10*i); } dc.SelectObject(GetStockObject(BLACK_PEN)); dc.MoveTo(0,250); dc.LineTo(l 100,250); m_pOutDev->ShowObrFurje(&dc);} CClipDlg::CClipDlg(CWnd* pParent /*=NULL*/): CDialog(CClipDlg::IDD, pParent)
{}
void CClipDlg..DoDataExchange(CDataExchange* pDX) { CDialog..DoDataExchange(pDX);} BEGIN_MESSAGE_MAP(CClipDlg, CDialog)
ON_BN_CLICKED(IDC_CLIP, OnClip) ENDMESSAGEMAPQ void CRecordDlg::OnClip() {CClipDlg* a; a = new CClipDlgQ; if(a!=NULL)
{ BOOL ret = a->CreateODD_CLIP,this); itXIret) AfxMessageBox("Error creating Dialog"); a->ShowWindow(SW_SHOW); } else AfxMessageBox("Error Creating Dialog Object");} void CClipDlg::OnClip() {CClientDC dc(this);
dc.SelectObject(GetStockObject(WHITE_PEN));
for(inti=0;i<llO;i++)
{ dc.MoveTo(10*L0);
dc.LineTo(10*i,800);
dc.MoveTo(0,10*i);
dc.LineTo(1100,10*i); } dc.SelectObject(GetStockObject(BLACK_PEN)); dc.MoveTo(0,100); dc.LineTo(l 100,100); m__pOutDev->ShowClip(&dc);}
// animate.h: header file #include <mmsystem.h> #include "OutDialog.h" /Mnclude "recorddl.h" #include "resource.h" #include <complex> using namespace std; class CDIB. public CObject { DECLARESERIAL(CDIB) public: CD1B0; ~CDIB();
BITMAPFNFO *GetBitmapInfoAddress()
{return m_pBMI;} void *GetBitsAddress()
{return m_pBits;} RGBQUAD *GetClrTabAddress()
{return (LPRGBQUAD)(((BYTE *)(m_pBMI)) + sizeof(BITMAPINFOHEADER));} int GetNumClrEntries();
BOOL Create(int width, int height, CPalette* pPal = NULL); BOOL Create(int width, int height,
HP ALETTE hPal);
BOOL Create(BITMAPrNFO* pBMI, BYTE* pBits, BOOL bOwnBits = FALSE); BOOL Create(BITMAPINFO* pPackedDTB); void *GetPixelAddress(int x, int y); int GetBitsPerPixelO
{return m_pBMI->bmiHeader.biBitCount;} virtual BOOL Load(const char* pszFileName = NULL); virtual BOOL Load(CFile* fp); virtual BOOL Load(WORD wResid); virtual BOOL Save(const char* pszFileName = NULL); virtual BOOL Save(CFile *fp);
virtual void Serialize(CArchive& ar); virtual void Draw(CDC *pDC, int x, int y); virtual void DrawfHDC hDC, int x, int y); virtual int GetWidthO (return DibWidth();} virtual int GetStorageWidth() (return StorageWidthQ;} virtual int GetHeight() (return DibHeight();} virtual BOOL MapColorsToPalette(CPalette *pPal); virtual BOOL MapColorsToPalette(HPALETTE hPal); virtual void GetRect(RECT* pRect);
virtual void CopyBits(CDIB* pDIB, int xd, int yd,int w, int h, int xs, int ys,COLORREF
clrTrans = OxFFFFFFFF);
virtual void StretchBits(CDIB* pDIB, int xd, int yd.int wd, int hd, int xs, int ys, int ws,
int hs,COLORREF clrTrans = OxFFFFFFFF);
virtual void DoubleBits(CDIB* pDIB, int xd, int yd,int xs, int ys, int ws, int
hs,COLORREF clrTrans = OxFFFFFFFF);
BOOL SetColorTable(CPalette* pPal); static BOOL IsWinDffi(BITMAPrNFOHEADER* pBIH); static int NumDIBColorEntries(BITMAPINFO* pBmpInfo); protected:
BITMAPINFO *m_pBMI; BYTE *m_pBits; BOOL mbMyBits; private:
int DibHeightO
(return m_pBMI->bmiHeader.biHeight;} int DibWidthQ
(return m_pBMI->bmiHeader.biWidth;} int StorageWidthO
(return (((m_pBMI->bmiHeader.biWidth * m_pBMI->bmiHeader.biBitCount)}}; class CDIBPal. public CPalette (public:
CDIBPalO;
~CDIBPal();
BOOL Create(CDIB *pDIB);
BOOL Create(BITMAPINFO* pBMI);
BOOL Create(RGBQUAD* pRGB, int iClrs);
void Draw(CDC *pDC, CRect *pRect, BOOL bBkgnd = FALSE);
void Draw(HDC hDC, RECT* pRect, BOOL bBkgnd = FALSE);
int GetNumColorsQ;
BOOL SetSysPalColors();
BOOL Load(const char* pszFileName = NULL);
BOOL Load(CFile* fp);
BOOL Load(UINT hFile);
BOOL Load(HMMIO hmmio);
BOOL Save(const char* pszFileName = NULL);
BOOL Save(CFile* fp);
BOOL SavefUTNT hFile);
BOOL Save(HMMIO hmmio);
BOOL CreateWash();
BOOL CreateSystemColorPaletteO;}; typedef HDC (WLNGAPI WinGCreateDCProc)(void); typedef HBITMAP (WLNGAPI WinGCreateBitmapProc)(HDC WinGDC,
const BITMAPINFO* pHeader, void** ppBits);
typedef UINT (WLNGAPI WinGSetDIBColorTableProc)(HDC WinGDC,
UINT Startlndex,
UINT NumberOfEntries,
const RGBQUAD* pCoIors);
typedef BOOL (WLNGAPI WinGBitBlfProc)(HDC hdcDest, int nXOriginDest,int
nYOriginDest, int nWidthDest,int nHeightDest,HDC hdcSrc, int nXOriginSrc,
int nYOriginSrc);
typedef BOOL (WINGAPI WinGStretchBltProcXHDC hdcDest, int
nXOriginDest,int nYOriginDest,int nWidthDest,int nHeightDest, HDC hdcSrc,irt
nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc);
class CDIBSurface: public CDIB { DECLARE_SERIAL(CDrBSurface) public: CDIBSurfaceQ; -CDIBSurfaceO; public:
CDC* GetDCO {return &m_dcBuffer;} HDC GetHDCQ {return (HDC) m_dcBuffer.GetSafeHdc();} public:
BOOL Create(int cx, int cy, CPalette* pPal = NULL); BOOL Create(int width, int height, HP ALETTE hPal); void BitBlt(CDC* pDC, int xd, int yd, int w, int h,
int xs, int ys); void BitBlt(HDC hDC, int xd, int yd, int w, int h,
int xs, int ys);
void StretchBlt(CDC* pDC, int xd, int yd, int wd, int hd,
int xs, int ys, int ws, int hs); void Draw(CDC* pDC); void Draw(HDC hDC, int x, int y); void SefPalettelCPalette* pPal);
BOOL Load(const char* pszFileName = NULL);
BOOL MapColorsToPalette(CPalette *pPal);
BOOL MapColorsToPalette(HPALETTE hPal); protected:
CPalette* m_pPal;
HP ALETTE m_hPal;
CDC m_dcBuffer; private:
static BOOL mbUseCreateDIBSection;
static BOOL mbUseWinG;
static WinGCreateDCProc* m_pWinGCDCProc;
static WinGCreateBitmapProc* m_pWinGCBProc;
static WinGSetDIBColorTableProc* m_pWinGSDCTProc;
static WinGBitBltProc* mjpWinGBBProe;
static WinGStretchBltProc* m_pWinGSBProc;
HBITMAP mhbmBufFer;
HBITMAP mhbmOld;
static BOOL CDIBSurface::TestPlatform();}; class COSBView: public CScrollView {protected:
COSBViewQ;
DECLAREDYNCREATE(COSBView) public:
CDocument* GetDocumentO; CDIB* GetDffiO {return m_pDIBSurf;} CDIBPal* GetPaletteQ {return m_pPal;} CDC* GetBufferDCO; public:
BOOL Create(CDIB* pDIB); BOOL Create(int w, int h, CPalette* pPal); void Draw(CRect* pClipRect = NULL); virtual void RenderfCRect* pClipRect = NULL) {return;} void AddDirtyRegion(CRect* pRect); void RenderAndDrawDirtyListO; public: virtual -COSBViewQ; virtual void OnDraw(CDC* pDC); virtual void OnInitialUpdate(); virtual void OnUpdate{CView* pSender,
LP ARAM Hint,
CObject* pHint);
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const; protected:
CDIBSurface* mjpDIBSurf;
CDffiPal* m_pPal; private:
CObList mDirtyList;
void EmptyDirtyList(); protected:
afxmsg void OnPaletteChanged(CWnd* pFocusWnd);
afxmsg BOOL OnQueryNewPalette();
afxmsg BOOL OnEraseBkgnd(CDC* pDC);
DECLAREMESSAGEMAPO}; inline CDocument* COSBView::GetDocument()
{ return (CDocument*) m_pDocument; } class CSprite;
class CSpriteNotifyObj: public CObject {public:
enum CHANGETYPE { ZORDER =0x0001, POSITION =0x0002, IMAGE 0x0004 };
public:
virtual void Change(CSprite *pSprite,CHANGETYPE change, CRect*
pRectl = NULL, CRect* pRect2 = NULL) = 0;};
class CSprite: public CDBB { DECLARE_SERIAL(CSprite) public:
CSprite();
~CSprite();
virtual int GetXQ { return m_x;} // get x
virtual int GetY() { return m_y;} // get y
virtual int GetZ() { return m_z;} // get z order
virtual void Render(CDIB* pDIB, CRect* pClipRect = NULL);
virtual BOOL HitTest(CPoint point);
virtual void SetPosition(int x, int y);
virtual void SetZ(int z);
virtual void SetNotificationObject(CSpriteNotifyObj* pNO)
{m_pNotifyObj = pNO;} virtual void Serialize(CArchive& ar); virtual BOOL Load(CFile *fp); virtual BOOL Load(char *pszFileName = NULL); virtual BOOL Load(WORD wResid);
Формат | Зона | Поз. | Позначення | Назва | Кільк. | Примітка | |||||||||
1 | ГЮИК. 505330.002 ПЗ | Текстові документи | |||||||||||||
Пояснювальна записка | 1 | ___ | |||||||||||||
арк. ф.А.4 | |||||||||||||||
Графічні документи | |||||||||||||||
Елементи текстів програмного коду | |||||||||||||||
файл формату *.doc | 1 | __ арк. ф. | |||||||||||||
А4 | |||||||||||||||
Демонстраційний графічний матеріал | |||||||||||||||
у вигляді презентації, файл формату | 1 | __ арк. ф. | |||||||||||||
*.ppt | А4 | ||||||||||||||
ГЮИК. 505330.002 ВД | |||||||||||||||
№ докум | Підп. | Дата | |||||||||||||
Виконав | Голосове керування тривимірними моделями функціонування ПР відомість дипломної роботи | Літера | Аркушш | Аркушів | |||||||||||
Перевір. | 1 | ||||||||||||||
Н.контр. | ХНУРЕ КАФЕДРА ТАВР | ||||||||||||||
Затв. | Невлюдов | ||||||||||||||
... и менеджмента Санкт-Петербургского Государственного технического университета соответствовал поставленной цели. Его результаты позволили автору разработать оптимальную методику преподавания темы: «Использование электронных таблиц для финансовых и других расчетов». Выполненная Соловьевым Е.А. дипломная работа, в частности разработанная теоретическая часть и план-конспект урока представляет ...
... разработки программ, но и разработку пакетов прикладных программ. Эти разработки должны обеспечивать высокое качество и вестись примерно так же, как и выпуск промышленной продукции. Достижения компьютерной техники 1. Универсальные настольные ПК Что такое настольный компьютер, объяснять никому не надо — это любимое молодежью устройство, чтобы красиво набирать тексты рефератов, а ...
... информация должна поступать в декодер при восстановлении звукового сигнала. Декодер преобразует серию сжатых мгновенных спектров сигнала в обычную цифровую волновую форму. Audio MPEG - группа методов сжатия звука, стандартизованная MPEG (Moving Pictures Experts Group - экспертной группой по обработке движущихся изображений). Методы Audio MPEG существуют в виде нескольких типов - MPEG-1, MPEG-2 и ...
... с применением полиграфических компьютерных технологий? 10. Охарактеризуйте преступные деяния, предусмотренные главой 28 УК РФ «Преступления в сфере компьютерной информации». РАЗДЕЛ 2. БОРЬБА С ПРЕСТУПЛЕНИЯМИ В СФЕРЕ КОМПЬЮТЕРНОЙ ИНФОРМАЦИИ ГЛАВА 5. КОНТРОЛЬ НАД ПРЕСТУПНОСТЬЮВ СФЕРЕ ВЫСОКИХ ТЕХНОЛОГИЙ 5.1 Контроль над компьютерной преступностью в России Меры контроля над ...
0 комментариев