通信原理实践(一)——音频信号处理
一、信号的离散化
1、采样定理:
–如果信号是带限的,并且采样频率fs超过信号最高频率的两倍,那么,原来的连续信号可以从采样样本中完全重建出来。
因此在仿真过程中,采样率(fs)是一个非常重要的参数。必须满足fs大于信号最高频率的两倍。
e.g:产生一段长度为1000的100Hz的正弦波
N = 1000; % 长度
fs = 8e3; % 采样率
fc = 100; % 正弦波频率
t = (0:N-1)’/fs; % 时间t
y = sin(2*pi*fc*t); % 产生的信号
plot(t, y, ‘b’); % t-y绘图
xlabel(‘time’);
ylabel(‘amplitude’);

二、利用声卡重现信号
1、原理:
声卡中含有一个DA转换器,可以将数字信号转为模拟信号
2、MatLab提供的函数
(1)首先:构建一个SoundCardDAC对象,并指定采样率fs。其中采样率通常位于5000~96000Hz之间,典型值为8kHz、16kHz、22.05kHz、44.1kHz、48kHz、64kHz。
dac = SoundCardDAC(fs);
(2)而后注册其善后方法(需要在函数内调用,不能用脚本)
onCleanup(@dac.delete);
(3)使用tx()或者tx_once()进行数模转换,信号幅度应落在[-1,1]之间(函数区别见m文件说明)
dac.tx(signal);
Ps:附上声卡封装好的对象函数代码
classdef SoundCardDAC < handle
% SoundCardDAC 利用声卡将数字信号转为模拟波形
% 利用obj=SoundCardDAC(fs)构造对象,其中fs为采样率,单位Hz
% 类方法: (1) tx(signal) 将信号signal添加到声卡缓存并进行播放,该函数可产生连续的信号输出
% (2) tx_once(signal) 直接播放信号signal,该函数仅产生一段突发的信号
% (3) delete 释放占用的资源,可在主函数中利用onCleanup调用 properties (SetAccess = private, GetAccess = private)
m_ao = 0;
m_fs = 44100;
m_state = 0; % 0: uninitialize, 1: ready, 2: runing
end methods
function obj = SoundCardDAC(fs)
obj.m_fs = fs;
obj.m_ao = analogoutput('winsound');
addchannel(obj.m_ao,1);
set (obj.m_ao, 'SampleRate', obj.m_fs);
obj.m_state = 1;
fprintf(1,'Info: Create soundCardDAC object, fs=%d.\n', fs);
end function tx(obj, signal)
sample_th1 = obj.m_fs * 0.4; % 保证声卡中至少有0.4s左右长度的数据
sample_th2 = obj.m_fs * 0.6; % 通常声卡缓冲区数据也不用太长 signal = reshape(signal, length(signal), 1); % 转为列向量 if obj.m_state == 0 % not allowed
error('Error: SoundCard does not be initialized.\n');
return;
end putdata(obj.m_ao, signal);
sample_av = get(obj.m_ao, 'SamplesAvailable'); if obj.m_state == 1 % ready
if sample_av > sample_th1
obj.m_state = 2;
start(obj.m_ao);
fprintf(1,'Info: Starting DAC...\n');
end
elseif obj.m_state == 2 % running
if sample_av < sample_th1 % 缓冲区数据量小于阈值,预示有可能程序实时性不够
fprintf(1,'Warning: Program efficiency may be too low.\n');
elseif sample_av > sample_th2 % 数据太快,让程序停顿一会儿
time_pause = (sample_av-sample_th2)/obj.m_fs;
pause(time_pause);
end
else
error('Error: Unknown error occured.\n');
end
end function tx_once(obj, signal)
signal = reshape(signal, length(signal), 1); % 转为列向量 if obj.m_state == 0 % not allowed
error('Error: SoundCard does not be initialized.\n');
elseif obj.m_state == 1 % ready
putdata(obj.m_ao, signal);
sample_av = get(obj.m_ao, 'SamplesAvailable');
start(obj.m_ao);
time_pause = sample_av/obj.m_fs + 0.2;
pause(time_pause);
stop(obj.m_ao);
elseif obj.m_state == 2
error('Error: Do not call tx() and tx_once() simultaneously.\n');
else
error('Error: Unknown error occured.\n');
end
end function delete(obj)
if obj.m_ao ~= 0
stop(obj.m_ao);
delete(obj.m_ao);
obj.m_ao = 0;
obj.m_state = 0;
fprintf(1,'Info: Destory soundCardDAC object.\n');
end
end
end end
使用这个面向对象的demo:(注意要保证相位连续)
function sine_gen
N = 5000; % 每一次产生的长度
fs = 16e3; % 采样率16kHz
fc = 400; % 正弦波频率 dac = SoundCardDAC(fs); %构造dac对象
onCleanup(@dac.delete); %注册善后函数 while 1
t = (0:N)'/ fs; % 时间t
y = sin(2*pi*fc*t); % 产生的信号
dac.tx(y);
end
end
通信原理实践(一)——音频信号处理的更多相关文章
- 通信原理实践(二)——幅度调制
一.幅度调制,并画出时域和频域波形 1.代码如下: function [ p_n ] = AM_func( N,fs,fm,Am,fc,Ac,Ma ) %UNTITLED 此处显示有关此函数的摘要 % ...
- 通信原理实践(六)——基带传输
一.基带传输引入 1.从数字带通传输说起 以上系统可以等价为: 这里"等价"的假设条件是 •信号通过滤波器不失真 •不存在码间串扰 意义:可以通过评估基带传输系统来获得数字带通传输 ...
- 通信原理实践(五)——2PSK 与2DPSK 通信系统
一.一些Matlab函数 二.2PSK调制解调,性能分析 1.2PSK调制 (1)图示 (2)Matlab代码 function [ s_t ,bb_t,bits] = psk2_module( nS ...
- 通信原理实践(四)——模拟通信系统性能分析
一.模拟通信系统性能分析 1.系统框图 2.信噪比定义 (1)输入信噪比: (2)输出信噪比: (3)调制制度增益: 3.模拟通信系统分析等价模型 即自己产生一个高斯白噪声,加入到调制信号,然后在送入 ...
- 通信原理实践(三)——FM调制
一.FM调制 1.代码如下: clc,clear; fm = ; % 调制信号频率(Hz) Am = 0.5; % 调制信号幅度 fc = 5e3; % 载波频率(Hz) Ac = ; % 载波幅度 ...
- Java网络编程UDP通信原理
前言 继续今天我们的Java网络编程--TCP和UDP通信 一.TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCP UDP 协议名称 传输控制协议 用户数据包协议 是 ...
- 基于web的IM软件通信原理分析
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
- SSL 通信原理及Tomcat SSL 配置
SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...
随机推荐
- 【转】ArrayList其实就那么一回事儿之源码浅析
转自:http://www.cnblogs.com/dongying/p/4013271.html?utm_source=tuicool&utm_medium=referral ArrayLi ...
- pypi 国内镜像 及修改全局方法
PyPi的官方网站为https://pypi.python.org,有时访问中会很慢,使用pip命令安装带其他依赖包的安装包,会经常失败.解决办法,使用国内PyPi镜像网站,修改pip的源. 网上搜索 ...
- springmvc 文件下传、上载、预览。以二进制形式存放到数据库(转载)
springmvc 文件上传.下载.预览.以二进制形式存放到数据库.数据库中的关于传入附件的字段我写了2个:一个存放内容accessory,一个存放文件的后缀filetype 上传:首先需要2个必须的 ...
- jquery的基本事件大全
].name); });jQuery.getScript( url, [callback] ) 使用GET请求javascript文件并执行. $.getScript(”test.js”, funct ...
- 【python】list,dict赋值不要用等号,要用extend,update
如果有一个list,我们用连等号的方式赋值 c = d = [1], 则当c改变时,d同样会改变.字典同理 正确做法应该是: d = [1] c = [1] 或者 d = [1] c.extend(d ...
- python if __name__ == '__main__'解析
废话不多说,正题: python中所有的模块都有一个内置属性 __name__,一个模块的 __name__ 的值取决于如何应用模块.如果 import 一个模块,那么模块__name__ 的值通常为 ...
- UIButton 的点击事件详解
UIControlEventTouchDown 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候. UIControlEventTouchDownRepeat 多点触摸按下事件,点触计数大于1 ...
- cell分割线宽度不满屏处理
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZ ...
- abcd
[问题描述]有4个长度为N的数组a,b,c,d.现在需要你选择N个数构成数组e,数组e满足a[i]≤e[i]≤b[i]以及 Σe[i]*c[i]=0,并且使得Σe[i]*d[i]最大.[输入格式]输入 ...
- IOS关于录音,播放实现总结
//音频录制(标准过程5,9更新) 准备:导入AVFoundation框架及头文件 1 设置会话类型,允许播放及录音AVAudioSession *audioSession = [AVAudioSes ...