C++
半截木头渡海洋
高出着眼,低处着手
展开
-
音频开发-设备管理模块接口
【代码】音频开发-设备管理模块接口。原创 2022-12-10 20:46:56 · 85 阅读 · 0 评论 -
模式设计的基本概念
设计习语,设计模式,架构模式模式从目的上分类:创建型模式 结构型模式 行为型模式模式从范围上分类:类模式,处理类与子类的静态关系 对象模式,处理对象间的动态关系模式从封装变化角度分类:组件协作:模板方法、策略模式、观察者(事件)模式 单一职责:装饰模式、桥模式 对象创建:工厂方法、抽象工厂、原型模式、构建器 对象性能:单例模式、轻量级模式、享元模式 接口隔离:门面模式、代理模式、中介者、适配器 状态变化:备忘录模式、状态模式 数据结构:组合模式、迭代器、职责链 行为变原创 2021-02-18 21:50:55 · 180 阅读 · 0 评论 -
webrtc 语音处理模块逐文档注释---APM类的接口文件audio_processing.h
modules/audio_processing/include/audio_processing.hwebrtc 语音处理模块调用接口定义在上述文件之中。struct AecCore;class AudioFrame;template<typename T>class Beamformer;class StreamConfig;class ProcessingConfig;class EchoCancellation;class EchoControlMobi.原创 2021-01-03 04:01:52 · 1317 阅读 · 0 评论 -
fseek 指令
fseek 时流位置指针的重定位指令。目的是对“指向当前流读写位置的指针”进行偏移设置。如:File *pInFile 指针,指向一个流,这个指针除了包含了流的起始位置、大小,还包含了一个指向当前读写位置的指针,fseek指令就是为了移动这个指针而设计的。fseek(pInFile,driftSize,SEEK_CUR);意思就是将pInFile的当前读写位置(SEEK_CUR)偏移driftSize个位置,使其指向SEEK_CUR + driftSize 。这样当使用fread(*,s原创 2020-06-04 10:47:48 · 1732 阅读 · 0 评论 -
几个定/浮点数相互转换的例子
32位系统中,浮点数包括单精度浮点数float(一般情况下双字节,64位系统中4字节)和双精度浮点数double(一般情况下四个字节,64位系统中8字节);浮点数的最高位是s位(符号位),1表示负号,0表示正号;符号位后面紧跟着一定长度的(单精度情况下半个字节或一个字节)指数位,指数位的大小指定了小数点的位置;剩余的位置是尾数位,尾数位中存放小数点移动后的结果。如浮点数:-11.0 写成二进制之后是1(符号)1011,这样为了将这个结果11011存放到float中,需要先对11011进行预处原创 2020-05-25 15:15:41 · 2336 阅读 · 0 评论 -
嵌套#ifdef的带参宏定义用法
#ifdef DEBUGTEST functionName1(); % write log#endiffunctionName1(); % write logvoid functionName1(){#ifdef DEBUGTEST % function body#endifreturn;};以上两个例子是期...原创 2020-01-21 22:42:08 · 3113 阅读 · 0 评论 -
windows系统WASAPI录音demo
microsoft官网给出的录音demo//-----------------------------------------------------------// Record an audio stream from the default audio capture// device. The RecordAudioStream function allocates a sha...转载 2019-12-26 15:46:56 · 1607 阅读 · 1 评论 -
从零基础开始使用GTEST完成单元测试
博客目标:1、搭建GTEST单元测试环境2、对已有的一个项目进行单元测试,测试内容 函数、类的公/私有方法单元测试开始之前,要先明确几个基本的概念,GTEST的单元测试实际上就是再单独创建一个工程,然后include待测试的函数/类,完成一些特定的测试功能,从这一点上来说,使用GTEST进行单元测试与自己创建空的工程调用待测函数完成一些测试功能是一样的。GTEST的优点在于提供了...原创 2019-07-14 14:42:57 · 3190 阅读 · 0 评论 -
VS2008 常用设置
修改text editor字体,默认字体的分号与冒号区别不明显,改成consolas可以解决这个问题修改字号到15#在alllanguage选项下的tabs中,勾选insert spaces,这样输入的的tab会被转为space形式。显示行号:text Editor ==》C/C++ ==》line number调试过程中显示变量的值debug==》windows==》au...原创 2019-06-21 16:16:16 · 1386 阅读 · 0 评论 -
C++的一些小知识点
===void * memcpy ( void * dest, const void * src, size_t num );将src中的前num个字节的内容拷贝到dest指向的地址中。===void * memcpy ( void * dest + N, const void * src, size_t num );dest是指针,指针 + N 是指针移动的意思...原创 2019-04-12 13:36:38 · 135 阅读 · 0 评论 -
引用与指针的差别
引用与指针的差别1】指针(pointer)可以为NULL,引用(reference)不能为NULL2】指针可以重新赋值,引用不可以重新赋值3】指针作为函数参数时候,需要在函数内对传入指针是否为NULL进行检验;而相同用途的引用不需要检验什么时候使用指针?什么时候使用引用?1】接口参数多用引用、数组,少传指针;2】不作为参数的情况下尽量使用指针,只有在以下两种情况下优先使用引...原创 2019-07-27 13:05:48 · 249 阅读 · 0 评论 -
C++ 的一些小知识点
基类的指针是可以指向派生类的对象的fatherClass *f;sonClass s;f = &s;像上面的用法是允许的,而且是常用的。上面的用法唯一的问题是基类指针无法访问派生类对象中的非基类成员,这是因为派生类对象的存储方式决定的,派生类分配的内存前半段存放从基类继承来的成员,后半段存放自己的成员。而基类指针的访问边界就是基类的大小,强行访问派生类的成员只会让编译器报错。...原创 2019-07-25 22:22:43 · 118 阅读 · 0 评论 -
C++ 的一些小知识点
切换分支之前,必须保存现场,依次执行以下命令:git add .git commit -m ""git checkout (branch)git pull有的时候代码明明已经回滚到一个之前编译ok的commit了,但是编译总是不过,不要怀疑git的功能,而编译不过可能是因为当前仓库中的工程对其他仓库的内容有依赖,虽然当前的仓库回滚到了一个编译ok的版本,但是相应的被依赖的仓库...原创 2019-07-23 09:53:03 · 146 阅读 · 0 评论 -
不要用多态方式处理数组
基类中重载运算符 <<;有一个专用来处理基类对象的函数;如果对这个函数传入的参数是单个对象,那么通常情况下这个函数可以接收基类对象,也可以接收派生类对象,这是C++的多态特性决定的;但是如果这个函数处理的是对象数组,因为指针算数表达式的工作原理,这个函数只能用来处理基类对象数组,虽然在函数形式上也可以接收派生类对象数组,但是函数的处理结果是不可控的,因经过函数内部的指针运算...原创 2019-07-31 23:34:33 · 269 阅读 · 0 评论 -
如无必要需求,构造类时,不必提供默认构造函数接口
所谓默认构造函数的功能,就是在没有任何输入参数的情况下将对象进行初始化。一般在以下三种情况中,会认为类的默认构造函数是必要的:1】产生一个对象数组的时候,数组的声明语法结构限制构造函数参数的提供,所以无法为数组中的对象提供构造参数,因此对象数组定义声明的时候,通常(虽然有三种方法可以一定程度上绕开这种限制:non-heap数组;指针数组;raw memory & placement n...原创 2019-08-06 02:18:51 · 422 阅读 · 0 评论 -
C++的四种强制转型与C的强制转型
在C++中有四种强制转型,但是也保留了C语言中的强制转型,从功能上来说C++的四种强制转型,只是对C方式强制转型的功能细分。C语言方式的强制转型原型如下(targetType)argument;# 例如(int)aDoubleNum;(BaseClass *) derivedPtr;在C++中,将强制转型细分为四种:static_cast; # 用于同级变量之间的相互转型...原创 2019-07-28 21:47:44 · 2831 阅读 · 0 评论 -
linux下的版本管理(github)
远程在远程github.com网站上建立一个仓库,假定仓库的名字yourRepo回到本地进入需要建立仓库的文件夹,执行命令:git init克隆远端仓库到本地(如果是clone则不要git init,否则会出错),clone到本地的项目会自动新建一个与远端仓库名称相同的文件夹,文件夹下有.git文件。git clone url建立本地仓库与github仓库的关...原创 2018-05-08 17:20:40 · 1418 阅读 · 0 评论 -
VS2008零基础学习C++开发《二》
回顾一点C++的基础编程知识对主程序进行编辑,在ultrasounddetect.cpp文档中也添加了几行打印信息。/* ultraSonicDetectMain.cpp Created by Shawn.li on 2019.4.7 All rights reserved*/#include <iostream>#include <stdio.h&...原创 2019-04-11 20:32:29 · 297 阅读 · 0 评论 -
VS2008零基础学习C++开发
学习目标:建立解决方案-工程,在工程中实现本地语音的读取,调用已有的算法函数对语音进行分析处理,输出分析结果。学习方法:面向搜索引擎+CTRL_C+CTRL_V第一步:建立解决方案需要明确的一点,VS中的解决方案并不是单独建立的,而是在创建项目的过程中引入的,引入后解决方案就相当于是工程的一个父目录,包含着工程。当然也可以在后续的工作中在该解决方案下添加新的工程,也可以添加单独的...原创 2019-04-08 16:13:55 · 638 阅读 · 0 评论 -
webRTC中回声消除(AEC)模块的编译与测试
整体过程同webRTC降噪(NS)、自动增益控制(AGC)模块的编译与测试一样,只是在aec_rdft.c文件中可能会报错,局部变量ip跟全局变量冲突的问题,可以将局部变量重新命名一下,就可以通过编译了。修改后的代码如下/* * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html * Copyright Takuya OOURA, 1996-2001...原创 2018-06-08 09:42:12 · 5723 阅读 · 1 评论 -
在linux系统上实现实时AEC功能
我们从今天起,开始做一个实时的回声消除应用。这个应用的工作环境描述如下:1】linux系统中2】系统通过电脑的喇叭播放音乐3】在播放音乐过程中打开录音功能进行录音我们的应用的目标:1】录音要求输出两个基本的音频文件:录音过程中喇叭的音频、MIC拾到的声音(说话声+喇叭回声)2】对MIC的拾到的声音进行回声消除处理,输出回声消除后的音频文件...原创 2018-06-14 16:21:57 · 2209 阅读 · 2 评论 -
webRTC降噪(NS)、自动增益控制(AGC)模块的编译与测试
本博客记录webRTC中降噪(NS)模块的编译与测试过程获取NS功能、测试代码以及测试语音文件,点击链接使用VS2015打开方案文件并生成在VS右侧资源管理器中,右键选择生成在debug文件夹中生成结果文件将“byby_8K_1C_16bit.pcm”、“lhydd_1C_16bit_32K.pcm”复制到和WebRtcAudioTest.exe文件统一个路径下执行WebRtcAudioTest....原创 2018-06-07 15:57:32 · 6570 阅读 · 3 评论 -
使用CMAKE编译webRTC中的AGC、NS、AEC代码
首先,了解一下CMAKE的基本语法其次,了解一下代码的基本结构然后,写一个CMAKE文件最后,测试一下编译的结果原创 2018-06-11 11:31:16 · 4420 阅读 · 2 评论 -
使用makefile编译C++程序
在通常的C++工程中会将不同的cpp文件按照功能分别存储在不同的文件夹中,此时如果使用一个makefile来处理所有文件夹下面的程序文件会使makefile显得复杂而且不易维护,这时候应该使用嵌套的思路,为每一个文件夹底下的程序文件编写一个makefile文件,然后有机的组合起来。文档结构C++编程学习文件夹下有两个子文件夹,每个文件夹下有对应名称的cpp文档以及编译规则文件makefile:de...原创 2018-05-08 15:35:36 · 1501 阅读 · 0 评论 -
linux 环境下开发 C++(编译)
1】输入语言切换,shift + super(就是win键)+空格2】调出客户命令终端:ctrl + alt + t3】安装vim: ① sudo apt-get update && sudo apt-get upgrade ② sudo apt-get install vim-gtk4】打开或者新建名为file的文件:vim file ① 进入插入模式:i ...原创 2018-05-07 14:49:03 · 371 阅读 · 1 评论 -
使用Makefile编译C++程序
编译的对象是C++ Primer Plus第11章第2小节的第一组程序:mytime0.hmytime0.cppusetime0.cpp三个程序文件放置在同一个文件夹下面,编写makefile如下:usetime:usetime0.o mytime0.o g++ -o usetime usetime0.o mytime0.ousetime0.o:usetime0.cpp mytime0.h...原创 2018-05-13 00:28:32 · 3533 阅读 · 0 评论 -
webRTC AEC 滤波器的自适应
权值更新就是使用SSE指令集加速完成NLMS算法的频域计算,具体实现细节见代码注释。static void FilterAdaptationSSE2(AecCore* aec, float* fft, float ef[2][PART_LEN1]) { in...原创 2018-07-17 13:56:44 · 1495 阅读 · 0 评论 -
大小写转换 --- C++在线编程练习
将字符串中的大写字母转换成小写字母class Solution {public: string toLowerCase(string str) { int strLength = str.size(); for(int iloop1 = 0; iloop1 <= strLength-1 ;iloop1++){ if('A...原创 2019-03-27 21:06:54 · 1495 阅读 · 0 评论 -
宝石与石头--- C++ 在线编程练习
给定字符串J代表石头中宝石的类型,和字符串S代表你拥有的石头。S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J中的字母不重复,J和S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。class Solution {public: int numJewelsInStones(string J, string S...原创 2019-03-26 14:48:52 · 744 阅读 · 0 评论 -
C++ 的一些小知识点
名称空间 namespace煮个栗子:东方一个上帝,西方一个上帝,两个人聊天的时候提起上帝来分不清对方聊的是哪个地方的上帝,就再聊天之前约定我们谈话内容都是用的东方名称空间,这样大家就清楚明了了。using namespace 东方;int main(){上帝组建了家庭; // 因为前面已经声明了名称空间是东方的,我们可以清晰的知道这个上帝的家庭包含的 ...原创 2019-03-26 10:02:34 · 117 阅读 · 0 评论 -
webRTC AEC 添加舒适噪声算法
webRTC的舒适噪声实际上就是,一个随机噪声经过同一帧消回声输出NLP参数的加权处理产生的噪声。如果是32K信号,则对产生的高频段随机噪声统一加权,加权值是同一帧消回声输出NLP参数的平均值。static void ComfortNoise(AecCore* aec, float efw[2][PART_LEN1], ...原创 2018-07-17 15:48:12 · 2934 阅读 · 1 评论 -
webRTC AEC 非线性滤波处理算法
先把代码贴上,有空时候回来注释static void NonLinearProcessing(AecCore* aec, short* output, short* outputH) { float efw[2][PART_LEN1], dfw[2][PART_LEN1], xfw[2][PART_LEN1]; complex_t comfortNoiseHband[PART_LEN...原创 2018-07-17 15:06:27 · 4619 阅读 · 4 评论 -
webRTC AEC 发散处理与抑制算法
所谓发散问题就是在自适应滤波的过程中出现了权值不收敛的问题,一般是由于参考信号与近场数据时间点没有对齐引起的。当滤波器的权值不收敛的时候,自适应滤波器就不能正常的跟踪参考信号产生正确的的合成回声,以至于无法完成回声消除的功能,甚至自适应滤波器会产生一些乱七八糟的信号,淹没近端信号或产生音爆。综上,回声消除过程中要对回声消除的残差进行监控,如果残差信号的能量超过了近场信号的数据,就说明出现了发散...原创 2018-07-17 14:08:25 · 2193 阅读 · 4 评论 -
webRTC AEC 远场滤波器
最后几句代码将远场经过滤波之后加到了传入的yf(合成回声信号)中,但是在调用本滤波器之前已经将yf全部设置为0了,因此输出的合成回声信号就是滤波器的输出。static void FilterFarSSE2(AecCore* aec, float yf[2][PART_LEN1]) { int i; // 设置分块数 const int num_partitions = aec-&...原创 2018-07-17 14:04:37 · 853 阅读 · 0 评论 -
webRTC AEC 归一化误差信号
因为误差信号的大小变化差异较大,不便于设置门限阈值,因此将误差信号e对远端信号x进行归一化,便于对与阈值比较。static void ScaleErrorSignalSSE2(AecCore* aec, float ef[2][PART_LEN1]) { // extern __m128 _mm_set_ps1(float _W); //返回一个__m128的寄存器,Sets the f...原创 2018-07-17 14:01:38 · 1056 阅读 · 0 评论 -
alsa录音demo
git stash 使用/*read from the default PCM device and writes to standard output for 5 seconds of data修改声音采集配置时候,出了修改声音通道数量,还应该考虑申请的缓冲区时候足够大 */#define ALSA_PCM_NEW_HW_PARAMS_API#include <alsa/as...原创 2018-05-10 15:14:07 · 3802 阅读 · 1 评论