65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 DirectX 的精美示波器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (6投票s)

2009年11月1日

CPOL

2分钟阅读

viewsIcon

53197

downloadIcon

3520

快速,真实,易于连接到您的应用程序。

The Oscilloscope, displaying demodulated QPSK data

引言

这个项目是一个简单的示波器,可以连接到任何应用程序。该软件的图形基于Direct3D,这使得场景类似于物理示波器;并且大部分工作负载由GPU执行,而不是CPU。

如果您的应用程序处理数字解调,那么这个项目非常适合您。具体来说,如果您的应用程序解调 PSK 数据,那么您可以使用这个软件示波器来查看输出数据的星座图。示波器可以显示任何速率的数据。您只需要在您的应用程序中植入一小段代码,我的可执行示波器将通过进程间通信 (IPC) 与您的应用程序进行通信。如果您不知道 IPC,请不要担心。您只需要将其复制并粘贴到您自己的代码中即可。

背景

在继续之前,我建议您下载并运行演示应用程序。这将帮助您对示波器的外观以及它如何连接到数据源(即您的应用程序)有一个基本的了解。演示应用程序包含一个数据源“Signal Generation.exe”,它生成 QPSK 数据并运行示波器以同时显示星座图。

Using the Code

我将分四个步骤解释如何使用示波器

  1. 在您的代码中,创建一个共享缓冲区。这将是存储星座数据和符号率的内存。您的应用程序将使用此缓冲区与我通信。将以下代码添加到您的应用程序。阅读注释以获取更多信息
  2. #include "..\Oscilloscope\SharedBuffer.h"
    // Specify the path to SharedBuffer.h
    
    // Global Variable
    SHARED_BUFFER *pSharedBuffer = NULL;
    HANDLE hMapFile = NULL;
    // Global Variable
    
    bool CreateMapFile(void)
    // Call this function from inside
    // the entry-point of your code. Must return true.
    {
        TCHAR szMapName[] = L"MyFileMappingObject";
    
        hMapFile = CreateFileMapping(
            INVALID_HANDLE_VALUE,    // use paging file
            NULL,            // default security 
            PAGE_READWRITE,        // read/write access
            0,            // max. object size 
            sizeof(SHARED_BUFFER),    // buffer size  
            szMapName);        // name of mapping object
    
        if (!hMapFile) 
        { 
            MessageBox(NULL, L"Could not open file mapping object.", 
                       L"Error", MB_OK | MB_ICONERROR);
            return false;
        } 
    
        pSharedBuffer = (SHARED_BUFFER *) MapViewOfFile(
            hMapFile,            // handle to mapping object
            FILE_MAP_ALL_ACCESS,    // read/write permission
            0,
            0,
            sizeof(SHARED_BUFFER));
    
        if (!pSharedBuffer) 
        { 
            MessageBox(NULL, L"Could not map view of file.", 
                             L"Error", MB_OK | MB_ICONERROR);
            return false;
        }
    
        return true;
    }
    
    void CloseMapFile()
    // Call this function just before the exit point of your code.
    {
        if(pSharedBuffer)
            UnmapViewOfFile(pSharedBuffer);
        pSharedBuffer = NULL;
    
        if(hMapFile)
            CloseHandle(hMapFile);
        hMapFile = NULL;
    }
  3. 现在,您有责任将星座数据(样本数据的 X 和 Y 分量)与符号率同步地存储在共享缓冲区中。例如,如果符号率为 2000,则必须每 0.5 秒在共享缓冲区中存储 1000 个样本。样本最好在 [-1, 1] 范围内。pSharedBuffer->xpSharedBuffer->y 是循环缓冲区;也就是说,每当您到达这些缓冲区的末尾时,您必须环绕到它们的开头。示波器也以循环方式读取这些缓冲区。缓冲区长度由 BUFF_SIZE 定义。结构 SHARED_BUFFERSharedBuffer.h 中声明。
  4. 运行示波器以查看星座图。将以下代码片段添加到您的代码中
  5. STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    ZeroMemory(&pi, sizeof(pi));
    CreateProcess(L"Oscilloscope.exe", NULL, NULL, NULL, TRUE, NULL, 
                  NULL, NULL, &si, &pi);
  6. 我的示波器将初始化 pSharedBuffer->hWnd 以指向自身。所以,当您完成使用示波器后,您可以轻松关闭它
  7. PostMessage(pSharedBuffer->hWnd, WM_QUIT, 0, 0);

备注

  1. 要使用可执行示波器,不需要额外的文件或模块。但是,如果您想自定义示波器代码,或编译并构建它,您必须安装 DirectX 9.0 SDK 并将其与 Visual Studio 集成。
  2. 第一个版本用于演示,可能会发生更改和改进。您的想法、建议和经验可以帮助我改进应用程序。我期待收到您的来信。

历史

  • 2009 年 11 月 1 日:上传第一个版本。等待反馈。
© . All rights reserved.