数字信号处理公式变程序(二)——插值

之前搞了一些数字信号处理算法编程(OC),一直没来得及整理,现在整理一下。陆续会更新,包括FFT、巴特沃斯滤波器(高低带通、高低带阻)、数据差值(线性、sinc、三次样条*)、数据压缩(等距、平均、峰值检测)和模仿matlab的STFT功能(spectrogram函数三维绘图)。

 

注:可能会有不足或者理解偏差的地方,路过的高人请不吝赐教。

 

好啦,进入正题。

---------------------------------------------------------------------------------------

由于三次样条在数字信号处理中用的不是很多(或者说我用的不是很多),所以虽然实现了,这里就不贴出来了。本文讲插值运算(线性和sinc插值)的具体实现。

一、线性插值

1.原理与实现

线性插值就是在两点间插入指定个数的数据点,使得这两点间的数(包括原来的点与插入的点)满足线性关系。如下图所示黑色的点为原来的点,红色的点为新插入的点。原理为对相邻两点横纵坐标分别求N+1平均(N为需要插入的点数)。

注意,为了提高效率,求平均后尽量用加法运算代替乘除法运算。

比较简单。。。


2.书写代码并结果测试

 

给定数组t1,其纵坐标为1和-1交替。

t1[20] = {0.000000,0.942478,3.141593,4.084070,6.283185,7.225663,9.424778,10.367256,12.566370,13.508848,15.707963,16.650441,18.849556,19.792033,21.991148,22.933626,25.132741,26.075219,28.274333,29.216811};

将插值后的数据点导入matlab绘制结果如下:

二、sinc插值
1.原理及实现

在数字信号处理应用中最常见的插值方式就是sinc插值,插值特点是使得插值后的数据更平滑、更接近于正弦波。

sinc(x)的表达式为

 

sinc插值运算的图解如下所示:(黑色的点为原来的点,红色的点为新插入的点,j表示当前插值点序号。

由于算法在图中已经很清楚。


2.结果测试

 

 

 

还是将线性插值测试中用到的数组进行sinc插值(插9个值),并将插值后的数组导入matlab绘制结果如下

 

另外,将插值后的数组以matlab绘图代码的形式贴上:

 

%% 线性插值测试
close all;
clear,clc;
% 插值前的序列
x11 = [0.000000,0.942478,3.141593,4.084070,6.283185,7.225663,9.424778,10.367256,12.566370,13.508848,15.707963,16.650441,18.849556,19.792033,21.991148,22.933626,25.132741,26.075219,28.274333,29.216811];
y11 = [-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000];

% 插值后的序列
x12 = [0.000000  0.314159  0.628319  0.942478  1.675516  2.408555  3.141593  3.455752  3.769911  4.084070  4.817108  5.550147  6.283185  6.597344  6.911504  7.225663  7.958701  8.691740  9.424778  9.738937  10.053097  10.367256  11.100294  11.833332  12.566370  12.880529  13.194689  13.508848  14.241886  14.974925  15.707963  16.022122  16.336282  16.650441  17.383479  18.116518  18.849556  19.163715  19.477874  19.792033  20.525071  21.258110  21.991148  22.305307  22.619467  22.933626  23.666664  24.399703  25.132741  25.446900  25.761060  26.075219  26.808257  27.541295  28.274333  28.588492  28.902652  29.216811];
y12 = [-1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000  0.333333  -0.333333  -1.000000  -0.333333  0.333333  1.000000];

figure;
plot(x11,y11,'b*',x11,y11,'b');
hold on
plot(x12,y12,'ro');
hold off
title('线性插值测试');
legend('原序列','原序列连线','插值后序列');

%% sinc插值测试

%插值前序列
x21 = [0.000000,0.942478,3.141593,4.084070,6.283185,7.225663,9.424778,10.367256,12.566370,13.508848,15.707963,16.650441,18.849556,19.792033,21.991148,22.933626,25.132741,26.075219,28.274333,29.216811];
y21 = [-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,1.000000];

%插值后序列
x22 = [0.000000  0.094248  0.188496  0.282743  0.376991  0.471239  0.565487  0.659735  0.753982  0.848230  0.942478  1.162389  1.382301  1.602213  1.822124  2.042035  2.261947  2.481858  2.701770  2.921681  3.141593  3.235841  3.330088  3.424336  3.518584  3.612831  3.707079  3.801327  3.895575  3.989822  4.084070  4.303981  4.523893  4.743805  4.963716  5.183628  5.403539  5.623451  5.843362  6.063274  6.283185  6.377433  6.471681  6.565928  6.660176  6.754424  6.848672  6.942920  7.037167  7.131415  7.225663  7.445575  7.665486  7.885398  8.105309  8.325221  8.545132  8.765044  8.984955  9.204867  9.424778  9.519026  9.613274  9.707521  9.801769  9.896017  9.990265  10.084513  10.178760  10.273008  10.367256  10.587167  10.807079  11.026990  11.246902  11.466813  11.686724  11.906636  12.126547  12.346459  12.566370  12.660618  12.754866  12.849113  12.943361  13.037609  13.131857  13.226105  13.320352  13.414600  13.508848  13.728760  13.948671  14.168583  14.388494  14.608406  14.828317  15.048229  15.268140  15.488052  15.707963  15.802211  15.896459  15.990706  16.084954  16.179202  16.273450  16.367698  16.461945  16.556193  16.650441  16.870352  17.090264  17.310175  17.530087  17.749998  17.969910  18.189821  18.409733  18.629644  18.849556  18.943804  19.038051  19.132299  19.226547  19.320795  19.415042  19.509290  19.603538  19.697785  19.792033  20.011944  20.231856  20.451767  20.671679  20.891590  21.111502  21.331413  21.551325  21.771236  21.991148  22.085396  22.179644  22.273891  22.368139  22.462387  22.556635  22.650883  22.745130  22.839378  22.933626  23.153537  23.373449  23.593360  23.813272  24.033183  24.253095  24.473006  24.692918  24.912829  25.132741  25.226989  25.321237  25.415484  25.509732  25.603980  25.698228  25.792476  25.886723  25.980971  26.075219  26.295130  26.515042  26.734953  26.954865  27.174776  27.394687  27.614599  27.834510  28.054422  28.274333  28.368581  28.462829  28.557076  28.651324  28.745572  28.839820  28.934068  29.028315  29.122563  29.216811];
y22 = [-1.000000  -0.617690  -0.201088  0.216756  0.602562  0.925666  1.160668  1.289632  1.303638  1.203564  1.000000  0.712316  0.366955  -0.004895  -0.370050  -0.696253  -0.955009  -1.124079  -1.189415  -1.146360  -1.000000  -0.764650  -0.462511  -0.121619  0.226711  0.550740  0.821176  1.013816  1.111717  1.106689  1.000000  0.802201  0.532115  0.215075  -0.119436  -0.440503  -0.718625  -0.928418  -1.050931  -1.075358  -1.000000  -0.832378  -0.588504  -0.291365  0.031228  0.349231  0.633156  0.856796  0.999643  1.048770  1.000000  0.858267  0.637126  0.357472  0.045568  -0.269404  -0.558074  -0.793609  -0.954209  -1.025122  -1.000000  -0.881468  -0.680861  -0.417145  -0.115130  0.196855  0.489614  0.735811  0.912521  1.003358  1.000000  0.902947  0.721464  0.472698  0.180065  -0.128949  -0.425367  -0.681431  -0.873198  -0.982778  -1.000000  -0.923357  -0.760136  -0.525734  -0.242202  0.063822  0.363610  0.629042  0.835232  0.962864  1.000000  0.943190  0.797797  0.577492  0.302967  0.000000  -0.302967  -0.577492  -0.797797  -0.943190  -1.000000  -0.962864  -0.835232  -0.629042  -0.363610  -0.063822  0.242202  0.525734  0.760136  0.923357  1.000000  0.982778  0.873198  0.681431  0.425367  0.128949  -0.180065  -0.472698  -0.721464  -0.902947  -1.000000  -1.003358  -0.912521  -0.735811  -0.489614  -0.196855  0.115130  0.417145  0.680861  0.881468  1.000000  1.025122  0.954209  0.793609  0.558074  0.269404  -0.045568  -0.357472  -0.637126  -0.858267  -1.000000  -1.048770  -0.999643  -0.856796  -0.633156  -0.349231  -0.031228  0.291365  0.588504  0.832378  1.000000  1.075358  1.050931  0.928418  0.718625  0.440503  0.119436  -0.215075  -0.532115  -0.802201  -1.000000  -1.106689  -1.111717  -1.013816  -0.821176  -0.550740  -0.226711  0.121619  0.462511  0.764650  1.000000  1.146360  1.189415  1.124079  0.955009  0.696253  0.370050  0.004895  -0.366955  -0.712316  -1.000000  -1.203564  -1.303638  -1.289632  -1.160668  -0.925666  -0.602562  -0.216756  0.201088  0.617690  1.000000];

figure;
plot(x21,y21,'b*',x21,y21,'b');
hold on
plot(x22,y22,'ro', x22,y22,'r');
hold off
title('sinc插值测试');
legend('原序列','原序列连线','插值后序列','插值后序列连线');


===============================================

 

OK,插值随笔。

 

 

已标记关键词 清除标记
书名:数字信号处理(第版)——高等学校电子信息类规划教材 作者:丁玉美 出版社:西安电子科技大学出版社 出版日期:2001年01月 页数:318 ISBN:9787560609225[十位:7560609228] 定价:21.00元 内容提要: 本书是在1994年编写的《数字信号处理》(全国统编教材)的基础上重新修订的,属数字信号处理基本理论和分析的基础书,系电子信息类部级重点规划教材。 全书共10章,第一章:时域离散信号和时域离散系统;第章:时域离散信号和系统的频域分析,包括傅里对换和Z换;第三、四章:离散傅里叶交换、快速傅里叶交换;第五章:时域离散系统的基本网络结构与状态量分析法;第六、七章:无限脉冲响应数字滤波器的设计、有限脉冲响应数字滤波器的设计;第八章:其它类型的数字滤波器,包括全通滤波器、梳状滤波器、格型滤波器以及抽取与插值滤波等;第九章:数字信号处理的实现,包括实现中的量化误差分析、软件实现和硬件实现;第十章:上机实验,包括四个试验的实验指导。每章后有习题。 本书可作为无线电技术类专业本科生的必修课教材,或者相近专业本科、大专生的必修课或选修课教材,也可作为有关科技人员的数字信号处理理论基础参考书。 为便于教与学,本书的学习指导书已出版,书中含有习题解答。 图书目录: 绪论 第一章 时域离散信号和时域离散系统 1.1 引言 1.2 时域离散信号 1.3 时域离散系统 1.4 时域离散系统的输入输出描述法——线性常系数差分方程 1.5 模拟信号数字处理方法 习题 第章 时域离散信号和系统的频域分析 2.1 引言 2.2 序列的傅里叶换的定义及性质 2.3 周期序列的离散傅里叶级数及傅里叶换表示式 2.4 时域离散信号的傅里叶换与模拟信号傅里叶换之间的关系 2.5 序列的Z换 2.6 利用Z换分析信号和系统的频域特性 习题 第三章 离散傅里叶换(DFT) 3.1 离散傅里叶换的定义 3.2 离散傅里叶换的基本性质 3.3 频率域采样 3.4 DFT的应用举例 习题 第四章 快速傅里叶换(FFT) 4.1 引言 4.2 基2 FFT算法 4.3 进一步减少运算量的措施 4.4 分裂基FFT算法 4.5 离散哈特莱换(DHT) 习题 第五章 时域离散系统的基本网络结构与状态量分析法 5.1 引言 5.2 用信号流图表示网络结构 5.3 无限长脉冲响应基本网络结构 5.4 有限长脉冲响应基本网络结构 5.5 状态量分析法 习题 第六章 无限脉冲响应数字滤波器的设计 6.1 数字滤波器的基本概念 6.2 模拟滤波器的设计 6.3 用脉冲响应不法设计IIR数字低通滤波器 6.4 用双线性换法设计IIR数字低通滤波器 6.5 数字高通、带通和带阻滤波器的设计 6.6 IIR数字滤波器的直接设计法 习题 第七章 有限脉冲响应数字滤波器的设计 7.1 线性相位FIR数字滤波器的条件和特点 7.2 利用窗函数法设计FIR滤波器 7.3 利用频率采样法设计FIR滤波器 7.4 利用切比雪夫逼近法设计FIR滤波器 7.5 IIR和FIR数字滤波器的比较 习题 第八章 其它类型的数字滤波器 8.1 几种特殊的滤波器 8.2 格型滤波器 8.3 简单整系数数字滤波器 8.4 采样率转换滤波器 习题 第九章 数字信号处理的实现 9.1 数字信号处理中的量化效应 9.2 数字信号处理技术的软件实现 9.3 数字信号处理技术的硬件实现 第十章 上机实验 10.1 引言 10.2 关于实验用计算机语言 10.3 实验一:信号、系统及系统响应 10.4 实验:用FFT作谱分析 10.5 实验三:用双线性换法设计IIR数字滤波器 10.6 实验四:用窗函数法设计FIR数字滤波器 附录 附录A 用Masson公式求网络传输函数H(z) 附录B 矩阵的幂和逆矩阵的计算方法 附录C 实验用MATLAB工具箱函数简介 附录D FHT程序清单(FORTRAN) 参考文献
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页