最近帮别人做了个东西,这里分享一下pcm原始数据绘图的思路

1、pcm数据采样位数,根据采样位数选取适合自己绘图的采样点的数量

2、计算出最大最小的的采样点的值差

3、根据要显示pcm数据的控件宽高,根据pcm原始数据的在pcm数据的偏移计算出x坐标,根据pcm数据采样的数值大小计算出y坐标

4、绘图,依次进行相邻数据点绘图

以下是在Duilb中绘图的代码:

     std::vector<char> pcm_buffer;
FILE * file = NULL;
file = fopen("pcm\\20180601155322.pcm", "rb"); if (file != NULL) {
//
pcm_buffer.clear();
pcm_buffer.shrink_to_fit(); fseek(file, , SEEK_END);
unsigned int size_byte = ftell(file);
fseek(file, , SEEK_SET);
pcm_buffer.resize(size_byte);
fread(&pcm_buffer[], size_byte, , file);
fclose(file);
size_byte /= ;
int step = , len = size_byte;
if (size_byte > ) {
len = ;
step = (int)(size_byte / len);
}
short * pcm_16 = (short*)(&pcm_buffer[]);
std::vector<float> pcm_float;
pcm_float.resize();
for (int i = , n = ; n < len; i += step, n++) {
pcm_float[n] = pcm_16[i];
} float max = pcm_float[], min = pcm_float[];
for (int i = ; i< pcm_float.size(); i++){
if (max < pcm_float[i]){
max = pcm_float[i];
}
if (min > pcm_float[i]){
min = pcm_float[i];
}
}
int w = m_rcItem.right - m_rcItem.left;
int h = m_rcItem.bottom - m_rcItem.top;
std::vector<PointF> points;
float diffVal = max - min;
for (int i = ; i < pcm_float.size(); i++){
points.push_back(PointF(i * w / pcm_float.size(), h - (pcm_float[i] - min) / diffVal * h));
} const DWORD backColor = 0xFFC9C9C9;
CRenderEngine::DrawColor(hDC, m_rcItem, backColor);
const DWORD backLineColor = 0xFF0000FF;
for (int i = ; i < points.size() - ; i++){
RECT rect;
rect.left = points[i].X;
rect.top = points[i].Y + m_rcItem.top;
rect.right = points[i + ].X;
rect.bottom = points[i + ].Y + m_rcItem.top;
CRenderEngine::DrawLine(hDC, rect, , backLineColor);
}
}

绘图效果:

测试绘图代码: https://github.com/karllen/cef3-duilib-YDDemo/tree/master/PcmMediaDemo

pcm原始数据绘制的更多相关文章

  1. Origin9.1如何使用原始数据(Raw Data)绘制风向玫瑰图

    核心提示:今天为大家简单介绍下如何使用原始数据绘制风向玫瑰图.本例以Origin 9.1进行演示.1.本例所用数据截图如下,列A为风向,列B为风速.2.选中两列数据,进入Plot下的Specializ ...

  2. 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(二)

    作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第二篇,主要讲述发送端程序的原理和过程. 第一 ...

  3. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(3)- 音频显示实现(Matplotlib, NumPy1.15.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之音频显示实现. 音频显示是Jays-PySPEECH的主要功能,Jays-PySPEECH借 ...

  4. MMIO----Wav格式文件解析

    DirectSound只支持Wav格式的音频文件,在创建次缓冲区之前需要先确定播放的Wav音频数据的格式.如果是从本地Wav文件播放,则需要先读出它的数据格式. 1. Wav音频格式布局 Wav是WA ...

  5. Kinect2.0获取关节姿态(Joint Orientation)

    Bones Hierarchy 骨骼层次结构从SpineBase作为根节点开始,一直延伸到肢体末端(头.指尖.脚): 层级结构如下图所示: 通过IBody::GetJointOrientations函 ...

  6. ffmpeg转码参数设置

    ffmpeg用了很久了,也没有想写点什么. 刚接触ffmpeg也是有大量的不理解的地方,不过慢慢的了解多了基本上都是可以使用的. 本文主要介绍如何使用ffmpeg.exe进行转码.编译好的ffmpeg ...

  7. 基于Allwinner的Audio子系统分析(Android-5.1)

    前言 一直想总结下Audio子系统的博客,但是各种原因(主要还是自己懒>_<),一直拖到现在才开始重新整理,期间看过H8(Android-4.4),T3(Android-4.4),A64( ...

  8. 易百教程人工智能python修正-人工智能监督学习(分类)

    分类技术或模型试图从观测值中得出一些结论. 在分类问题中,我们有分类输出,如“黑色”或“白色”或“教学”和“非教学”. 在构建分类模型时,需要有包含数据点和相应标签的训练数据集. 例如,如果想检查图像 ...

  9. 使用ffmpeg.exe进行转码参数说明

    使用ffmpeg.exe进行转码参数说明 摘自:https://blog.csdn.net/coloriy/article/details/47337641 2015年08月07日 13:04:32  ...

随机推荐

  1. 音频管理器(AudioManager)

    MainActivity.java package com.wwj.serviceandboardcast;   import android.app.Activity; import android ...

  2. js,javascript,打印对象,object

    function writeObj(obj){ var description = ""; for(var i in obj){ var property=obj[i]; desc ...

  3. c++中指针的指针和指针的引用的使用

    当指针作为函数的参数进行传递时,实际上本质上是安置传递,即将指针进行了一份拷贝,在函数的内部对这个指针的修改实际上就是对一个在函数内部的那个局部变量的修改.这点事和引用不同的,引用实际上是在参数传递时 ...

  4. 07-css的继承性和层叠性

    css有两大特性:继承性和层叠性 继承性 面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法.那么我们现在主要研究css,css就是在设置属性的.不会牵扯到方法的层面 ...

  5. HDFS块文件和存放目录的关系

    详情请参见DatanodeUtil.java中的函数idToBlockDir(File root, long blockId). 如果block文件没有放在正确的目录下,则DataNode会出现&qu ...

  6. mod与%的区别

    mod与%的区别 %与mod的区别: %出来的数有正有负,符号取决于左操作数,而mod只能是正: 所以要用%来计算mod的话就要用这样的公式:a mod b = (a % b + b) % b: 括号 ...

  7. python之随机验证码

    一.内置函数 chr ------把数字转换为字母 ord-------把字母转换为数字 n = chr(65) print (n) m = ord("A") print(m) 二 ...

  8. LigerUi中为Grid表加上序号,并调整适当宽度!(实例)

    LigerUi中为Grid表加上序号,并调整适当宽度!(实例) dataAction: 'server', pageSize: 20, toolbar: {},           url: 'ndl ...

  9. Android-Java控制多线程执行顺序

    功能需求: Thread-0线程:打印 1 2 3 4 5 6 Thread-1线程:打印1 1 2 3 4 5 6 先看一个为实现(功能需求的案例) package android.java; // ...

  10. CEF3编译添加mp4支持(对应CefSharp63.0.3),chromium63(3239),附release下载

    编译环境需求(3239版本) win7或更高,64位 vs2017 15.3.2+ 默认位置安装 不需要安装附带的win10sdk,sdk单独装 Windows 10.0.15063.468 SDK ...