通信原理实践(一)——音频信号处理
一、信号的离散化
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 参考资料 .................................................................. ...
随机推荐
- iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁
我们在使用dispatch_sync 时可能会出现死锁,看下面的例子: import UIKit class ViewController: UIViewController { var seri ...
- [转][Android]FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别
原文链接:http://blog.csdn.net/zhaokaiqiang1992 FragmentPagerAdapter是android-support-v4支持包里面出现的一个新的适配器,继承 ...
- Divide and Conquer:Monthly Expense(POJ 3273)
Monthly Expense 题目大意:不废话,最小化最大值 还是直接套模板,不过这次要注意,是最小化最大值,而不是最大化最小值,判断的时候要注意 联动3258 #include <iostr ...
- js验证手机号
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- [C#]Datatable和json互相转换操作
#region DataTable 转换为Json字符串实例方法 /// <summary> /// GetClassTypeJosn 的摘要说明 /// </summary> ...
- SQL常用命令整理
1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNcolum ...
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
reference : http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...
- [Android Pro] Android 4.3 NotificationListenerService使用详解
reference to : http://blog.csdn.net/yihongyuelan/article/details/40977323 概况 Android在4.3的版本中(即API 18 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)
大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...
- [转]DB2类型转换函数
Src URL:http://www.cnblogs.com/QQParadise/articles/2642677.html