一、信号的离散化

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. 通信原理实践(二)——幅度调制

    一.幅度调制,并画出时域和频域波形 1.代码如下: function [ p_n ] = AM_func( N,fs,fm,Am,fc,Ac,Ma ) %UNTITLED 此处显示有关此函数的摘要 % ...

  2. 通信原理实践(六)——基带传输

    一.基带传输引入 1.从数字带通传输说起 以上系统可以等价为: 这里"等价"的假设条件是 •信号通过滤波器不失真 •不存在码间串扰 意义:可以通过评估基带传输系统来获得数字带通传输 ...

  3. 通信原理实践(五)——2PSK 与2DPSK 通信系统

    一.一些Matlab函数 二.2PSK调制解调,性能分析 1.2PSK调制 (1)图示 (2)Matlab代码 function [ s_t ,bb_t,bits] = psk2_module( nS ...

  4. 通信原理实践(四)——模拟通信系统性能分析

    一.模拟通信系统性能分析 1.系统框图 2.信噪比定义 (1)输入信噪比: (2)输出信噪比: (3)调制制度增益: 3.模拟通信系统分析等价模型 即自己产生一个高斯白噪声,加入到调制信号,然后在送入 ...

  5. 通信原理实践(三)——FM调制

    一.FM调制 1.代码如下: clc,clear; fm = ; % 调制信号频率(Hz) Am = 0.5; % 调制信号幅度 fc = 5e3; % 载波频率(Hz) Ac = ; % 载波幅度 ...

  6. Java网络编程UDP通信原理

    前言 继续今天我们的Java网络编程--TCP和UDP通信 一.TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信   TCP UDP 协议名称 传输控制协议 用户数据包协议 是 ...

  7. 基于web的IM软件通信原理分析

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

  8. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  9. SSL 通信原理及Tomcat SSL 配置

    SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...

随机推荐

  1. NoSQL之【MongoDB】学习(二):DML和查询操作说明

    摘要: 操作MongoDB的方法和关系型数据库差别很大,现在对他们进行说明,后期会逐步完善. ##开头表示MySQL** 开头表示MongoDB 创建: Mongodb:文档数据库,擅长存非结构化数据 ...

  2. [Android] RelativeLayout, LinearLayout,FrameLayout

    Android RelativeLayout 属性 // 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上; android:layout_below ...

  3. Git-windows安装包

    下载地址 http://192.168.168.230/sw-search-sp/soft/4e/30195/Git-2.7.2-32-bit_setup.1457942412.exe 来自为知笔记( ...

  4. HDU 4862 Jump(最小K路径覆盖)

    输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...

  5. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

  6. 【leetcode】Swap Nodes in Pairs (middle)

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  7. C/C++不同文件夹下包含头文件的方法及#include的使用

    转自:http://blog.sina.com.cn/s/blog_6e0693f70100so42.html 本文主要介绍了如何不同文件夹下使用预处理器指示符#include. 假设我们有如下一个工 ...

  8. TCP/IP的Socket编程

    1. TCP/IP.UDP的基本概念 TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,他是一个工业标准的协议集, ...

  9. instanceof、 isinstance 与 isAssignableFrom的区别

    instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false. 形象地:自身实例或子类实例 instanc ...

  10. 51nod1057(python2计算n!)

    题目链接:www.51nod.com/onlineJudge/questionCode.html#!problemId=1057 思路:直接for循环呗- 代码: n = int( raw_input ...