【matlab】简易声音通信系统

2023-05-16

文章目录

  • 简介
  • 调制
  • 发送与接收
  • 同步
  • 解调

简介

本文章介绍了一个简易的用matlab写的声音通信系统

主要由如下部分组成:
调制 -> 发送接收 -> 同步 -> 解调

调制

首先一个实际的通信系统在调制之前应该还有编码+码元划分的过程,但是因为这里只是简单的过一遍声音通信系统的流程,尽量只保留核心部分,因此在随机生成码元之后,就直接开始调制了。

在本系统中,我们设定 1 symbol(码元) = 2 bit ,那么一个码元的取值就有 0 1 2 3四种情况,

% 系统参数设置
symbols_tx = [0, 1, 2, 3];
symbols_tx = repmat(symbols_tx, 1, 40);
samples_per_symbol = 600;
fs = 48000;
period = samples_per_symbol / fs;
nBits = 16;
amplitude = 2 ^ nBits - 1;
nChannels = 1;

为了使发送的音频时长适中,发送160个码元,每个码元600个采样点,采样率设为常用的48000HZ(发送96000个采样点,时长为2s)

随机生成码元后,就可以开始调制了。

% 定义chirp载波
% 频段设计原则
% 高频段尽量不要downchirp表示另一个,不然容易搞混
ts = linspace(0, period, samples_per_symbol);
chirp_0 = chirp(ts, 100, period, 4000, 'linear') * amplitude;
chirp_1 = chirp(ts, 4000, period, 100, 'linear') * amplitude;
chirp_2 = chirp(ts, 4000, period, 12000, 'linear') * amplitude;
chirp_3 = chirp(ts, 12000, period, 4000, 'linear') * amplitude;

chirps_tx = [];
for i=1:length(symbols_tx)
    switch symbols_tx(i)
        case 0
            chirps_tx = [chirps_tx, chirp_0];
        case 1
            chirps_tx = [chirps_tx, chirp_1];
        case 2
            chirps_tx = [chirps_tx, chirp_2];
        case 3
            chirps_tx = [chirps_tx, chirp_3];

    end    
end

按我的理解,调制就是将码元变成一段信号,比如变成一段正弦波,将基带信号变为频带信号,以方便传输
现在常用OFDM等调制技术,但是本系统简便为主,就将4种码元分别调制为4种不同频段的chirp信号,chirp信号就是频率不断变化的正弦信号。

调制代码很简单,先定义4种用于调制的chirp信号,然后遍历所有码元,将每个码元用一个chirp信号代替,就调制完了

调制完的信号就可以发送了

发送与接收

maltab操纵音频的发送与接收非常方便,有 audioplayer 和 audiowriter 这两个函数可以使用

% 发送
myPlayerObj = audioplayer(chirps_tx, fs, nBits);
myPlayerObj.StartFcn = 'disp(''Start Playing.'')';
myPlayerObj.StopFcn = 'disp(''End of Playing.'')'; 
play(myPlayerObj);

因为 windows系统问题,一台电脑自发自收的话收到的信号幅度很小,于是我借了舍友一台电脑用来发送音频,我这边录下来然后再处理

% 接收
myRecorderObj = audiorecorder(fs, nBits, nChannels);
myRecorderObj.StartFcn = 'disp(''Start Recording.'')';
myRecorderObj.StopFcn = 'disp(''End of Recording.'')';
record(myRecorderObj, 5);

接收代码中的5代表录音5秒

同步

因为各种原因,接收端不可能第一个采样点开始就是发送端发送的信号,肯定会有一段时延,但是要做时延的话就必须要找到RX信号(在本系统中,就是5秒的录音)中接收到TX信号的第一个采样点,这可以通过使用TX信号从RX信号开头向右滑动求相关系数来实现。

在这里插入图片描述
对于没做过的人来说看文字可能会理解不了,代码如下:

%% 同步
% 找开头的范围定在(1:fs*2)
detectRange = fs;
% 窗滑动步长
stride = 1;
head_idx = 1;

num_move = detectRange / stride;

max_corr_array = zeros(1, num_move);
for i = 1:num_move
    corr_temp = corrcoef(chirps_rx( head_idx : head_idx+length(chirps_tx)-1 ), chirps_tx);
    
    max_corr_array(i) = corr_temp(2);
    
    head_idx = head_idx + stride;
end

[max_value, max_idx] = max(max_corr_array);

上述代码中,detectRange 取 2*fs 是因为在本系统情境下,2秒内tx信号肯定会到达,搬运代码的话要具体情况具体分析

得到的 max_value 就是作滑动相关后得到的最大的相关系数,max_idx就是最大相关系数的索引位置,也就是TX信号的开头,也就是作解调的起点

解调

本系统采用最简单的轮流匹配相关法来解调(另一个python系统中还有更先进的数字脉冲压缩法,但是轮流匹配也够用了)

轮流匹配相关也就是从解调起始点开始,将RX信号以TX信号的长度为单位切割为一段一段,然后令TX信号的4种码元的对应调制波形分别与这些切割段求相关系数,相关系数最大的那个码元就是解调结果。

在这里插入图片描述

start_idx = max_idx;
validChirpData = chirps_rx(start_idx : start_idx + symbols_num * samples_per_symbol - 1);

demod_symbols_array = zeros(1, symbols_num);
max_corr_values = zeros(1, symbols_num);
% 和同步相比,stride变成了 samples_per_symbols
% 注意 validChirpData 是列向量, chirp_x是行向量,要转置
for i = 1:symbols_num
    corr_array = zeros(1, 4);
    
    corr_0 = corrcoef(validChirpData( (i-1)*samples_per_symbol+1 : i*samples_per_symbol ), chirp_0');
    corr_array(1) = corr_0(2);
    
    corr_1 = corrcoef(validChirpData( (i-1)*samples_per_symbol+1 : i*samples_per_symbol ), chirp_1');
    corr_array(2) = corr_1(2);
    
    corr_2 = corrcoef(validChirpData( (i-1)*samples_per_symbol+1 : i*samples_per_symbol ), chirp_2');
    corr_array(3) = corr_2(2);
    
    corr_3 = corrcoef(validChirpData( (i-1)*samples_per_symbol+1 : i*samples_per_symbol ), chirp_3');
    corr_array(4) = corr_3(2);

    
    [temp_max_value, temp_max_idx] = max(corr_array);
    max_corr_values(i) = temp_max_value;
    switch temp_max_idx
        case 1
            demod_symbols_array(i) = 0;
        case 2
            demod_symbols_array(i) = 1;
        case 3
            demod_symbols_array(i) = 2;
        case 4
            demod_symbols_array(i) = 3;
    end
end

demod_symbols_array 就是解调后的结果,统计一下误码率

% 统计每种symbol的错误率
symbol0_num = length(find(symbols_tx==0));
symbol1_num = length(find(symbols_tx==1));
symbol2_num = length(find(symbols_tx==2));
symbol3_num = length(find(symbols_tx==3));

err_symbol0_num = 0;
err_symbol1_num = 0;
err_symbol2_num = 0;
err_symbol3_num = 0;
%%%%%%%%%%%%%%%%%%%%%%%%

for i = 1:symbols_num
    if demod_symbols_array(i) ~= symbols_tx(i)
        switch symbols_tx(i)
            case 0
                err_symbol0_num = err_symbol0_num + 1;
            case 1
                err_symbol1_num = err_symbol1_num + 1;
            case 2
                err_symbol2_num = err_symbol2_num + 1;
            case 3
                err_symbol3_num = err_symbol3_num + 1;
        end     
    end
end

disp(['symbol 0 误码率: ', num2str(err_symbol0_num / symbol0_num)]);
disp(['symbol 1 误码率: ', num2str(err_symbol1_num / symbol1_num)]);
disp(['symbol 2 误码率: ', num2str(err_symbol2_num / symbol2_num)]);
disp(['symbol 3 误码率: ', num2str(err_symbol3_num / symbol3_num)]);

得到结果,误码率为0
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【matlab】简易声音通信系统 的相关文章

  • ubuntu使用proxychains给终端设置代理

    有时 xff0c 我们需要下载一些国外网站上的东西 xff0c 如果用国内网络直接下载的话 xff0c 往往是连接不上的 或者有时下载一个东西速度很慢 xff0c 这都是因为国内网络限制的问题 xff0c 大大影响了我们的工作效率 解决方法
  • int为什么占4个字节?一个字节为什么是8位?

    不知道大家有没有思考过这样的问题 xff0c 一个字节为什么是8位呀 xff0c 也许还有小伙伴不知道我说的这些是什么 xff0c 没关系往下看 第一个解释 xff08 历史 xff09 是IBM为System 360设计了一套8位EBCD
  • K8S之kubectl命令详解及示例

    目录 1 查看类命令 2 操作类命令 3 进阶命令操作 4 kubectl replace 重启pod的四种方法 5 kubectl语法 1 查看类命令 获取节点和服务版本信息 kubectl get nodes 获取节点和服务版本信息 x
  • ROS运动规划学习五---global_planner

    文章目录 前言一 global planner功能包结构二 planner core1 执行过程2 calculatePotentials 3 getPlanFromPotential 总结 前言 本节将学习ROS中的全局规划期global
  • ROS自定义消息---发布数组和整型数据

    ROS自定义消息 数组和整型数据 前言一 ROS中的消息数据格式二 自定义话题消息1 新建msg文件2 编写发布者和接收者程序 总结 前言 ROS自带的消息格式已经包含一维数组 xff0c 有时候我们需要定义多维数组 xff0c 以及混合数
  • Markdown中的公式、字母表示汇总

    Markdown中的公式 字母表示汇总 1 常用希腊字母表2 数学公式 最近几个月打了很多Markdown公式 xff0c 隔一段时间就会忘一些表示方式 xff0c 还不如在这里慢慢汇总记录 xff0c 以后要用的时候来查就行了 xff01
  • CMake项目中神器:CMakeLists.txt

    首次接触 CMake xff0c 见识了 CMakeLists txt 的强大后 xff0c 赶紧整理出来分享一下 参考资料 xff1a Cmake 3 6 W3Cschool参考手册 本文讲述了一个 CMake 项目 xff0c 在从单文
  • TCP详解之拥塞控制

    概述 TCP模块还有一个重要任务 xff0c 就是提高网络利用率 xff0c 降低丢包率 xff0c 并保证网络资源对每条数据流的公平性 xff0c 这就是所谓的拥塞控制 拥塞控制的四个部分 xff1a 慢启动 拥塞避免 快速重传 快速恢复
  • frps搭建自己的内网穿透服务器

    frps搭建自己的内网穿透服务器 开发过程中 xff0c 很多时候我们需要用到内网穿透 xff0c 将自己的服务器映射到外网 xff0c 下面说一下怎么用frps搭建自己的内网穿透服务器 frps Github地址 里面有中文文档 xff0
  • 更换backbone心得

    1 对于目标检测 xff0c backbone相当于连接中间环节 xff0c 连接着图片输入和后面的检测头 xff0c 所以在更换网络时候只要注意输入backbone的数据形式以及后面一个环节要求输入的形式 xff0c 把backbone的
  • from torch._C import *ImportError: DLL load failed while importing _C: 找不到指定的模块。

    更新torch的版本 xff0c 原先是1 4 0出现这个问题 xff0c 更新到1 11 0后解决 pip install torch 61 61 1 11 0 43 cpu torchvision 61 61 0 12 0 43 cpu
  • 模型衡量标准recall precision accuracy f1score(hmean)

    问题背景 xff1a 在处理分类问题时 xff0c 会遇到一种情况 xff1a 假设一个二元分类问题 xff1a 假设我们的预测算法是 xff1a xff0c 这个算法忽略特征值 xff0c 不管任何情况下都是预测等于0 毫无疑问这是一个糟
  • layoutlmV3使用步骤

    1 layoutlm系列的预训练权重全都是放在huggingface上面 xff0c 安装官方教程如果下载失败 xff0c 可以在linux系统下载 xff0c 然后将下载的缓存文件保存 或者在官网上下载并保存 需要下载的文件如下图 2 将
  • Python引用路径

    0 官方建议 xff0c 总是优先使用绝对引用 xff0c 只有在引用路径较为复杂导致引用代码很长时 xff0c 才考虑使用相对引用 绝对引用 优点是清晰且直接 xff0c 可以很容易就确定引用文件位置 xff1b 且即使当前文件的位置发生
  • 关于batch normalization的理解

    套餐 xff1a 卷积 43 BN 43 激活 xff0c 原始的BN0 61 X E X std xff0c 减去均值除以标准差 xff0c 改进后的BN 61 BN0 43 xff0c 其中 和 是通过模型学习得到的 原因 xff1a
  • 基于tablemaster的表格检测与表格重构。

    1 结果展示 原图1 原图1的结果 原图2 原图2的结果
  • 【文献笔记】【精读】MobileNet V1

    文章目录 1 论文结构2 研究的问题3 文献综述3 1 当前 xff08 2017 xff09 已有的DNN的问题3 2 当前已有的网络轻量化的方法 4 MobileNet 简介4 1 本网络创新点4 2 本网络优点 5 MobileNet
  • 【知识点】神经网络输入归一化区别:[0, 1]和[-1, 1]

    1 前置知识 1 1 ReLU的单侧抑制 参考 xff1a RELU的单侧抑制 单侧抑制含义 xff1a relu的曲线是一个折线 xff0c 在小于0的部分一直为0 xff0c 而在大于0的部分是一条斜率为1的直线 单侧抑制的优点 xff
  • 【知识点】机器学习降维方法

    摘抄文章 xff1a 打破 维度的诅咒 xff0c 机器学习降维大法好 为什么数据需要降维 机器模型用来帮忙预测一个目标变量 xff0c 但是不一定输入图像的每一个特征都对应目标变量 xff0c 这会使模型变得复杂 这里所说的降维的纬度 x
  • Windows + Linux 双系统的安装

    Windows 43 Linux 双系统的安装 参考自 https blog csdn net flyyufenfei article details 79187656 参考自 https blog csdn net u012052268

随机推荐