简介:


这篇文章将讲述内插器的框架和线性内插器的原理。线性内插器有一个很常见的用途,就是用于图像的缩放,于是我突然好奇,能不能对一段采样频率Fs为44.1kHz的音频进行采样频率为Fs/8的降采样/下采样,再用内插器有效地复原出原音频信号呢?答案留在后面。

一、内插器


首先介绍内插这个概念。按 Digital Signal Processing- A computer-Based Approach 一书中所说:“降低序列抽样率的过程称为抽取,而实现抽样的多抽样率结构称为抽取器,所以,增加抽样率这个相反过程就称为内插。用于内插的多抽样率结构称为内插器。”

内插器的种类其实有不少种,分别用于不同的系统中。常见的分为线性内插器和非线性内插器。在这里介绍线性内插器。

线性内插器的原理相当简单,我们先看看他的结构图:

其中的 ↑L 是上采样器,它完成什么功能呢?我们看图即可:

首先假如x[n]长这样:

那么它上采样之后,比如L=4(注意这里,L为多少则频率乘以L倍,直观点就是两个值的间隔多L-1的插值):

所以,上采样的过程实际上就是往中间插入了L-1个零点。注意这里是数字信号,所以n是正整数,但是对应到时域,那就是在原本间隔为Ts的两个值有等间隔地插入三个值,相当于Ts除以了4,也即采样率Fs乘以了4。若不是很清楚这个过程可以去看本专栏的另一篇文章:【信号处理】采样定理的深入浅出。

得到上采样的序列后,采样器会根据得到的序列计算一个全新的序列,其计算式如下:

内插之后就得到:

我们可以看到,L=4的内插器的输入输出关系为:若此时n在插入的零值的位置上,内插的值就受到旁边的两个原本的值的影响,但是若n在原本的值上,它只受旁边三个距离以内的影响,而它三个距离以内都是0.所以原本的值不会被影响到,也就不会有失真

读者必须注意,这个得到的结果是根据上采样之后,插值仍然为0的  计算而来的,刚学的时候通常会疑惑,比如我从n=0一直计算到n=5,那么原本为0的插值应该有值了才对啊,这样的话不会影响到原本的值吗?但其实算法不是这样的,它是像读表一样,计算内插后的序列  的值的时候,我读  的需要的值,进行计算后,填入 

二、MATLAB 仿真


这里是对音频信号的仿真,注意我这里用了我本专栏另一篇文章【信号处理】ADC中量化的更多细节的量化方法编码和解码。然后用双线性内插器插值。

%%
clear;clc;close all;
% Sampling at 44.1 kHz
[audio_signal,Fs]=audioread('Jacky_Audio_Signal.mp3'); % Sampling Interval: Ts=1/Fs%%
% Sampling at Ts=8*(1/Fs)
audio_signal_sampled=audio_signal(1:8:end,1);
%sound(audio_signal_sampled,Fs/4);%%
% non-uniform Quantizing & Source Coding
len_sig=size(audio_signal_sampled,1); % Length of the audio signal
parallel_code=zeros(len_sig,8); % A store
max_value=max(audio_signal_sampled);
piece=max_value/2048;
for i=1:1:len_sigcoding_value=audio_signal_sampled(i);% Step1: Sign Codeif coding_value>0parallel_code(i,1)=1;elseparallel_code(i,1)=0;end% Step2: Segment Codescoding_value_abs=abs(coding_value);if coding_value_abs>=max_value/2parallel_code(i,2)=1;parallel_code(i,3)=1;parallel_code(i,4)=1;% Step3: Inner Segment Codesbit_string=dec2bin( (coding_value_abs-max_value/2)/(64*piece),4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));elseif (coding_value_abs>=max_value/4)&(coding_value_abs<max_value/2)parallel_code(i,2)=1;parallel_code(i,3)=1;parallel_code(i,4)=0;bit_string=dec2bin( (coding_value_abs-max_value/4)/(32*piece),4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));elseif (coding_value_abs>=max_value/8)&(coding_value_abs<max_value/4)parallel_code(i,2)=1;parallel_code(i,3)=0;parallel_code(i,4)=1;bit_string=dec2bin( (coding_value_abs-max_value/8)/(16*piece),4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));elseif (coding_value_abs>=max_value/16)&(coding_value_abs<max_value/8)parallel_code(i,2)=1;parallel_code(i,3)=0;parallel_code(i,4)=0;bit_string=dec2bin( (coding_value_abs-max_value/16)/(8*piece),4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));elseif (coding_value_abs>=max_value/32)&(coding_value_abs<max_value/16)parallel_code(i,2)=0;parallel_code(i,3)=1;parallel_code(i,4)=1;bit_string=dec2bin( (coding_value_abs-max_value/32)/(4*piece),4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));elseif (coding_value_abs>=max_value/64)&(coding_value_abs<max_value/32)parallel_code(i,2)=0;parallel_code(i,3)=1;parallel_code(i,4)=0;bit_string=dec2bin( (coding_value_abs-max_value/64)/(2*piece),4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));elseif (coding_value_abs>=max_value/128)&(coding_value_abs<max_value/64)parallel_code(i,2)=0;parallel_code(i,3)=0;parallel_code(i,4)=1;bit_string=dec2bin( (coding_value_abs-max_value/128)/(1*piece),4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));elseif (coding_value_abs>=0)&(coding_value_abs<max_value/128)parallel_code(i,2)=0;parallel_code(i,3)=0;parallel_code(i,4)=0;bit_string=dec2bin(coding_value_abs/piece,4);parallel_code(i,5)=str2double(bit_string(1));parallel_code(i,6)=str2double(bit_string(2));parallel_code(i,7)=str2double(bit_string(3));parallel_code(i,8)=str2double(bit_string(4));end
end%%
% Source Decoding - Decode Quantilization
[nov,~]=size(parallel_code); % The amount of value%%
% Decoding (This step takes too much time, and hopefully I can solve it in the future
audio_signal_retrieve=zeros(nov,1);
max_value=max(audio_signal_sampled);
piece=max_value/2048;
for i=1:1:novcode=parallel_code(i,:);value=0;% Segment Decodeseg_index=code(2)*2^2+code(3)*2^1+code(4);if seg_index==0gap=(max_value/128)/16;step=0;elseif seg_index==1gap=(max_value/128)/16;step=16*piece;elseif seg_index==2gap=(max_value/64)/16;step=32*piece;elseif seg_index==3gap=(max_value/32)/16;step=64*piece;elseif seg_index==4gap=(max_value/16)/16;step=128*piece;elseif seg_index==5gap=(max_value/8)/16;step=256*piece;elseif seg_index==6gap=(max_value/4)/16;step=512*piece;elseif seg_index==7gap=(max_value/2)/16;step=1024*piece;end% Inner Segment Codeinner_seg_index=2^3*code(5)+2^2*code(6)+2*code(7)+code(8);value=inner_seg_index*gap+step;% Signif code(1)==0value=-value;endaudio_signal_retrieve(i)=value;
end%%
% Test the audio
sound(audio_signal_retrieve,Fs/8);%%
% 2 Factors Linear Interpolation
audio_signal_litp=zeros(2*nov,1);
audio_signal_litp(2:2:end)=audio_signal_retrieve;  % Upper Sampling
buffer=zeros(2*nov,1);
for i=3:2:2*nov-1buffer(i)=0.5*audio_signal_litp(i-1)+0.5*audio_signal_litp(i+1);
end
buffer(1,1)=audio_signal_litp(2,1)*0.5;
audio_signal_litp=audio_signal_litp+buffer;%%
% Test the audio after interpolation
sound(audio_signal_litp,Fs/4);

内插其实可以用MATLAB的函数:interp(signal,r)

signal就是你要内插的信号,r就是L,即上采样倍数。

三、仿真结果


我发现,对音频进行线性内插好像不是很能恢复原来的音质,但是内插绝对不会让原音频失真。内插后听起来会有些刺耳的杂音,估计是内插后得到的,总之效果不太好。

【信号处理】内插器原理和MATLAB仿真相关推荐

  1. AOA(Angle of Arrival,到达角)定位算法及其误差分析的原理和MATLAB仿真

    二站测向定位算法 1.测向原理 如图所示,有基站S1(x1,y1,z1),S2(x2,y2,z2)S_1(x_1,y_1,z_1),S_2(x_2,y_2,z_2)S1​(x1​,y1​,z1​),S ...

  2. 【定时同步系列5】Farrow内插器结构原理和MATLAB实现

    重要声明:为防止爬虫和盗版贩卖,文章中的核心代码和数据集可凭[CSDN订阅截图或公z号付费截图]私信免费领取,一律不认其他渠道付费截图! 引言 通常我们接收到的信号是过采样的 x ( m T s ) ...

  3. 无模型自适应迭代学习控制原理和matlab代码仿真学习记录

    无模型自适应ILC原理及代码实现 这里学习的是很老的一篇论文<基于无模型自适应控制的反馈-前馈迭代学习控制系统收敛性研究>,作者是晏静文和侯忠生,大家有兴趣可以找来看看.这里主要介绍的无模 ...

  4. 信号处理之FIR数字滤波器(Matlab仿真)

    数字滤波器的作用是滤除不感兴趣的信号,留下想要的信号.数字滤波器可分为无限脉冲响应(IIR)数字滤波器.有限脉冲响应(FIR)数字滤波器两种,两者各有优缺点,其中FIR数字滤波器因其具有良好的线性相位 ...

  5. 拉普拉斯算子的原理和matlab实现代码

    一.基本原理 拉普拉斯算子是一种二阶导数算子,是各向同性的微分运算,具有旋转不变性,可以满足不同走向的图像边界的锐化要求. 对一个二维图像函数f(x,y),它的拉普拉斯算子定义为: x方向上的二阶微分 ...

  6. 语音识别中的MFCC的提取原理和MATLAB实现

    一.首先让我们借用并澄清几个语音学中的概念 1.临界频带与听觉掩蔽 听觉临界频带:设纯音频率为,用噪声(设频率为)掩蔽纯音时,在噪声湮没的纯音的过程中,起作用的是频率在以内的噪声,称为临界频带.即当噪 ...

  7. TOPSIS模型原理和MATLAB代码实现

    IMMC2020:熵权TOPSIS 笔记整理来自清风老师的数学建模课程:TOPSIS教程 目录 1. 层次分析法的局限性(主观求权重方法) 2. TOPSIS法引入 2.1 一个指标的情况 2.2 2 ...

  8. 卡尔曼滤波原理和Matlab以及python代码实现

    文章目录 前言 一.卡尔曼滤波原理 最后对卡尔曼滤波的预测步和更新步公式进行总结: 二.Matlab代码 三.Python代码 前言 本文主要讲解卡尔曼滤波的原理以及Matlab和python代码实现 ...

  9. 碎片图像的拼接处理和matlab仿真

    由于所使用的碎片,背景颜色都是白色,而且部分碎片正好在两个不同的文字之间,因此,没法直接使用颜色匹配或者文件匹配的方法. 第二,由于很多碎片其边都是直线的,所以我们也没法直接使用很多论文所介绍的随机不 ...

最新文章

  1. Python学习笔记第五周
  2. Android开源框架——图片加载库Glide
  3. 基于安卓手机的辅助驾驶APP开发
  4. 第一百期:Java架构师:高并发下的流量控制
  5. linux创建用户已存在哪里,解决linux下创建用户时出现 Creating mailbox file: 文件已存在...
  6. 集成电路的设计 —— 引脚
  7. NLP自然语言处理必修清单(修炼法则)
  8. 缩减 Visio 图片外围空白
  9. 09-10c语言试卷a,09C语言试卷A-B(试题).doc
  10. Linux USB驱动-鼠标驱动
  11. Windows10超级好用的虚拟机
  12. 华为手机的视频剪辑功能居然这么强大,太实用啦
  13. java程序员语录_java程序员励志说说26条
  14. Jquery+SpringMVC实现上传Excel文件,并批量导入
  15. 多媒体的计算机系统,多媒体计算机系统().PPT
  16. 如何优雅地追回被骗款项(上篇)
  17. ubuntu20 装机配置、安装必备软件
  18. matlab内联函数怎么作图,第1讲:向量,函数和作图
  19. uniapp之小程序扫码如何获取二维码里的参数
  20. HTTP keep-alive和TCP keepalive的区别,你了解吗?

热门文章

  1. IE 浏览器 判断 增加 支持 IE8 IE9 IE10 IE11等 IE浏览器(是不是IE浏览器判断)
  2. 语雀实现收藏网页的功能(借助印象笔记)
  3. 蛙蛙推荐:蛙蛙浏览器
  4. Elasticsearch之 cerebro 安装配置详细使用
  5. 实现个人域名跳转指定网站
  6. Python3.9,寻找质数,埃拉托色尼算法
  7. 分享一下PPT常规使用方法和技巧
  8. vue3+vite环境搭建 vue3+vite实战
  9. office图标无法正常显示
  10. 微信小程序学习3(wxss)