使用c语言进行语音数字信号分析:

一、 基础知识
波形输入设备:
waveInGetNumDevs();返回当前系统的波形输入设备个数。

WAVEINCAPS:结构体, 表示波形输入设备的能力。即使用该结构体变量可以在逻辑上表示一个物理设备。(设备的名称、设备音道、设备版本号、制造商等信息。)

waveInGetDevCaps(num,cap,size) 用于将设备的信息传给设备结构体.

HWAVEIN 定义声音设备的句柄.

WAVEFORMATEX 定义声音设备的采样方式(频率 字长等类型)

waveInOpen(设备标识句柄指针,设备标识符,采样格式指针,固定的回调函数,事件句柄,回调机制的数据结构,传入数据类型)

WAVEHDR 此结构定义用于标识一个波形音频缓冲器中的报头,

waveInGetDevCaps(设备句柄,能力结构体,能力结构体大小)

waveInPrepareHeader(设备句柄,)

该函数启动指定设备的输入

waveInStart( HWAVEIN hwi 设备句柄)

基本函数说明如上所示,下面看一个录音的程序:

int main(){/* 录音 */// Deviceint nReturn = waveInGetNumDevs();//返回波形输入设备的个数printf("输入设备数目:%d\n", nReturn);for (int i = 0; i < nReturn; i++){WAVEINCAPS wic;waveInGetDevCaps(i, &wic, sizeof(WAVEINCAPS));printf("#%d\t设备名:%s\n", i, wic.szPname);}// openHWAVEIN hWaveIn;//WAVEFORMATEX wavform;//采样格式wavform.wFormatTag = WAVE_FORMAT_PCM;wavform.nChannels = 2;wavform.nSamplesPerSec = 8000;wavform.nAvgBytesPerSec = 44100 * 16 * 2 / 8;wavform.nBlockAlign = 4;wavform.wBitsPerSample = 16;//采样比特wavform.cbSize = 0;//定义录音格式waveInOpen(&hWaveIn, WAVE_MAPPER, &wavform, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION);//开启设备,系统会自己找到相应的录音设备;回调函数完成数据的接收任务WAVEINCAPS wic;waveInGetDevCaps((UINT_PTR)hWaveIn, &wic, sizeof(WAVEINCAPS));printf("打开的输入设备:%s\n", wic.szPname);for (int i = 0; i < FRAGMENT_NUM; i++){wh[i].lpData = new char[FRAGMENT_SIZE];wh[i].dwBufferLength = FRAGMENT_SIZE;wh[i].dwBytesRecorded = 0;wh[i].dwUser = NULL;wh[i].dwFlags = 0;wh[i].dwLoops = 1;wh[i].lpNext = NULL;wh[i].reserved = 0;waveInPrepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR));waveInAddBuffer(hWaveIn, &wh[i], sizeof(WAVEHDR));}//准备数据空间// recordprintf("Start to Record...\n");buf_count = 0;waveInStart(hWaveIn);while (buf_count < BUFFER_SIZE){Sleep(1);}printf("Record Over!\n\n");// cleanwaveInStop(hWaveIn);waveInReset(hWaveIn);for (int i = 0; i < FRAGMENT_NUM; i++){waveInUnprepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR));delete wh[i].lpData;}waveInClose(hWaveIn);system("pause");printf("\n");

缓存区:

static unsigned char buffer[BUFFER_SIZE] = { 0 };
static int buf_count = 0;
static WAVEHDR wh[FRAGMENT_NUM];

回调事件:

// 录音回调函数
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2)
{LPWAVEHDR pwh = (LPWAVEHDR)dwParam1;if ((WIM_DATA == uMsg) && (buf_count < BUFFER_SIZE)){int temp = BUFFER_SIZE - buf_count;temp = (temp > pwh->dwBytesRecorded) ? pwh->dwBytesRecorded : temp;memcpy(buffer + buf_count, pwh->lpData, temp);buf_count += temp;waveInAddBuffer(hwi, pwh, sizeof(WAVEHDR));}
}

注意下c语言的语法合理搭配上述代码块即可,完整的录音放音程序 见上传资源处

至此,归纳一下windows进行录音的过程:

  1. 获取录音设备信息: 在waveInCaps中dwFormat参数描述了这个结果;
    (采样频率\单双声道\量化位数)
    调用函数 waveInGetNumDevs(void) 获取声卡个数
  2. 调用函数 MMRESULT waveInGetDevCaps(uintuDeviceID,LPWAVEINCAPS pwic,UINT cbwic);
    第一个参数感觉有点绕,但实际上传个WAVE_MAPPER就可以了.
    第二个参数的第五个成员比较重要(可以理解为唯一重要),指明了支持音频信号标准的组合,具体看这个结构体的MSDN翻译。
    第三个参数指明了对应结构体的大小.
  3. 第三个函数是
    waveInOpen(LPHWAVEINphwi,
    UINTuDeviceID,
    LPWAVEFORMATEXpwfx,
    DWORDdwCallback,
    DWORDdwCallbackInstance,
    DWORDfdwOpen)

第三个参数可以使用一个函数进行初始化
3. 第四个调用的函数是开辟内存,用于存放声音信息:
MMRESULT waveInPrepareHeader(
HWAVEINhwi,
LPWAVEHDRpwh,
UINTcbwh
);
第二个参数比较关键,也是需要初始化的,

  1. 第5个函数把准备黑的缓存区发送给声音输入设备:
    MMRESULT waveInAddBuffer(

HWAVEINhwi,

LPWAVEHDRpwh,

UINTcbwh

); 当使用的缓冲区被填满后会通知应用程序;

  1. 最后一个就是waveInStart(),开启录音功能完成
    因此:

    例程见附件.

补充:
关于回调函数的使用:

void CALLBACK waveInProc(HWAVEIN   hwi,UINT      uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2
);

c语言----windows系列教程之音频录入与处理相关推荐

  1. R语言学习系列教程及高级绘图工具使用

    R语言系列教程 引言:每天学点R语言 R语言的安装 Rstudio的安装和运行 R语言常用语法代码示例 R语言数据导入测试代码及数据 R语言数据操作示例及数据 R语言数据操作进阶及控制结构 R语言中处 ...

  2. 从零学易语言编程系列教程

    第1章:脚本框架规划和设计     1.1脚本功能规划和界面设计(1)     1.2业务脚本界面设计的辅助链接(2)     1.3读取和保存业务脚本帐户库的配置功能     1.4商业脚本界面功能 ...

  3. 【CCS仿真系列教程】手把手教你纯软件仿真实现音频滤波

    [CCS仿真系列教程]手把手教你纯软件仿真实现音频滤波 事先说明 示例项目下载 示例使用说明 首先用Matlab生成加了噪声的音频 将我的项目弄你的CCS的WorkSpace中 把Matlab生成后的 ...

  4. linux怎么知道ping命令,教程方法;通过ping命令查看服务器类型(linux还是windows系列)电脑技巧-琪琪词资源网...

    琪琪词资源网-教程方法;通过ping命令查看服务器类型(linux还是windows系列)电脑技巧,以下是给大家带来的教程方法;通过ping命令查看服务器类型(linux还是windows系列),大家 ...

  5. C语言中 用选择结构编译算法,C语言程序设计立体化教程(高等教育立体化精品系列规划教材)...

    导语 内容提要 李刚.唐炜主编的<C语言程序设计立体化教程(高等教育立体化精品系列规划教材)>主要分为四篇:语法基础篇.程序设计结构篇.初级应用篇和高级应用篇:其中第一篇语法基础部分介绍了 ...

  6. c语言-命令行选项_EWSTM8系列教程06_工程节点选项配置(一)

    说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 该教程基于EWSTM8,大部分内容也适用于IAR其它产品( ...

  7. atitit 音频 项目 系列功能表 音乐 v3 t67.docx Atitit 音频 项目 系列功能表 音频 音乐 语言领域的功能表 听歌识曲功能 酷我功能。 铃声 功能。。 音频切割(按照副歌部

    atitit 音频 项目 系列功能表 音乐 v3 t67.docx Atitit 音频 项目 系列功能表 音频 音乐 语言领域的功能表 听歌识曲功能 酷我功能. 铃声 功能.. 音频切割(按照副歌部分 ...

  8. Unreal Engine 4 系列教程 Part 7:音频教程

    原文:Unreal Engine 4 Audio Tutorial 作者:Tommy Tran 译者:Shuchang Liu 在本篇教程中,你将学习如何以不同方法播放3D音效,并通过UI控制音频音量 ...

  9. Go 语言系列教程(七) : Map深入解析

    前言 Map 哈希表是一种巧妙并且实用的数据结构.它是一个无序的key/value对的集合,其中所有的key都是不同的,在Go语言中,map类型可以写为map[K]V ,key和value之间可以是不 ...

最新文章

  1. It is not safe to rely on the system's timezone settings
  2. Chrome开发者工具面板功能
  3. python3精要(9)-字符串表达式,切片步进,字符串与数字转换,字符串不变与修改
  4. springboot基本属性注入
  5. php结合jquery异步上传图片(ajaxSubmit)
  6. MFC中的文件读写技术
  7. LeetCode 96. 不同的二叉搜索树(DP)
  8. 羡慕!援鄂医疗队护士姐妹表达感谢 马云:婚礼记得通知我这个舅舅
  9. 纯干货 | UI界面中按钮设计CTA按钮\订阅按钮
  10. 数值分析(第五版) 第二章知识点总结
  11. C#学习常用类(1003)---Timer类(System.Timers.Timer)
  12. iis绑定php程序应用池设定,什么是IIS应用程序池以及应用程序池详解
  13. windows安装python3_windows下同时安装python2和python3
  14. 计算机组成原理(2021最新版)面试知识点集锦
  15. 几年基础架构的经验之谈[42 things I learned from building a production database]
  16. 【PWN系列】2015-Defcon Qualifier R0pbaby
  17. java实现 zip rar 7z 压缩包解压
  18. 如何将excel表格导入word_如何将Excel中的数据写入Word表?
  19. 文字烟雾消散特效制作
  20. Mybatis的where标签,还有这么多知识点

热门文章

  1. 如何在网上赚钱?80%的人都缺乏的赚钱思维
  2. 同个一个工作簿下多个工作表相同格式
  3. java教程 invoke_Java中Method的Invoke方法详细介绍
  4. c语言鸡兔同笼的实训报告的目的,车床实训报告实习目的
  5. 基于python的回归与集成算法进行房价预测
  6. html左侧导航栏树状,请问这种树形结构的导航栏用html或者js怎么实现?
  7. 屏幕截取招招看!教你十种屏幕抓取方法
  8. 改变世界的17个方程式
  9. 干货|史上最全HR必备招聘执行全流程 建议收藏
  10. 美国SC2016:真实力,才永久,联想HPC获得年度大满贯