通信原理实践(一)——音频信号处理

一、信号的离散化

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
时间: 2024-09-30 22:26:30

通信原理实践(一)——音频信号处理的相关文章

通信原理实践(二)&mdash;&mdash;幅度调制

一.幅度调制,并画出时域和频域波形 1.代码如下: function [ p_n ] = AM_func( N,fs,fm,Am,fc,Ac,Ma ) %UNTITLED 此处显示有关此函数的摘要 % 此处显示详细说明 % N = 3000; % 长度 % fs = 48e3; % 采样率 % fm = 300; % 调制信号频率 % Am = 0.5; % 调制信号幅度 % fc = 8e3; % 载波频率 % Ac = 1; % 载波幅度 % A0 %直流分量 A0 = Am / Ma; %

通信原理实践(六)&mdash;&mdash;基带传输

一.基带传输引入 1.从数字带通传输说起 以上系统可以等价为: 这里"等价"的假设条件是 ?信号通过滤波器不失真 ?不存在码间串扰 意义:可以通过评估基带传输系统来获得数字带通传输系统性能   2.两个模型SNR的关系 (1)假设带通传输系统中,2PSK信号功率为1/2,占用带宽为2,噪声功率为20(带宽2 ) (2)其等效基带传输系统的参数为基带功率1,占用带宽 ,噪声功率为20(带宽 ) (3)带通系统信噪比为时,其等效基带传输系统的信噪比为2   3.数字基带传输学习理由   4

通信原理实践(五)&mdash;&mdash;2PSK 与2DPSK 通信系统

一.一些Matlab函数 二.2PSK调制解调,性能分析 1.2PSK调制 (1)图示 (2)Matlab代码 function [ s_t ,bb_t,bits] = psk2_module( nSym ,Rb,fs,fc,Ac ) %UNTITLED7 此处显示有关此函数的摘要 % 此处显示详细说明 %nSym = 300; % 信息长度 %Rb = 200; % 信息速率 %fs = 48e3; % 采样率 %fc = 4e3; % 载波频率 %Ac = 1; % 载波幅度 %s_t %

通信原理实践(四)&mdash;&mdash;模拟通信系统性能分析

一.模拟通信系统性能分析 1.系统框图 2.信噪比定义 (1)输入信噪比: (2)输出信噪比: (3)调制制度增益: 3.模拟通信系统分析等价模型 即自己产生一个高斯白噪声,加入到调制信号,然后在送入解调器. 4.通信系统新能分析 (1) AM 解调器      AM 信号可用相干解调或者包络检波两种方法解调.对于100% 调制,且调制信号m(t) 是正弦波情况下,相干解调的调制制度增益为GAM = 2/3.对于包络检波来说,在大信噪比情况下它的性能与相干解调器的性能几乎一样.小信噪比的情况下,

通信原理实践(三)&mdash;&mdash;FM调制

一.FM调制 1.代码如下: clc,clear; fm = 500; % 调制信号频率(Hz) Am = 0.5; % 调制信号幅度 fc = 5e3; % 载波频率(Hz) Ac = 1; % 载波幅度 mf = 5; % 调频指数 %% %firstly kf = mf * 2 * pi * fm / Am diatf = kf * Am B = 2 * (mf + 1) * fm %% %secondly fs = 64e3; % 采样率 N = 3000; % 样点总数 t = (0:

通信原理系列(0)——开篇

通信原理系列(0)——开篇 该系列主要讲述通信原理上的一些知识点,作为通信专业出生的人,如果不做点笔记,没过多久差不多就全忘了,在这里做点笔记,给自己提提醒. 目录 1.通信系统模型 2.信道的概念 3.调制与编码

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

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是s

Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)

Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) 问题描述 Spark-1.6.0已经在一月份release,为了验证一下它的性能,我使用了一些大的SQL验证其性能,其中部分SQL出现了Shuffle失败问题,详细的堆栈信息如下所示: 16/02/17 15:36:36 WARN server.TransportChannelHandler: Exception in connection from /10.196.134.220:7337 java.lang.Out

Linux学习之路-http通信原理

http通信原理 应用通讯的基本模型分析 基本通讯流程: 客户端http应用使用本机IP+随机注册生成的TCP端口,形成套接字socket,调用系统socket api 再经过网络层.数据链路层.物理层层层封装,把数据送达请求的服务器,经过层层解封,送达对应的http服务监听的套接字socket监听的相应的端口上. 期间涉及到的N种技术: (1)TCP和UDP协议 TCP特点: a.面向连接:收发数居前必须和对方建立可靠连接,一个连接必须经过3次握手 简单过程: 主机A向主机B发出连接请求数据包