波形搜索算法
⑴ 窗帘幔的计算方法
幔(帘头): 1、 波形幔:半波、圆波2、 直幔:直板(单层、单色双层、双色双层);皱折(百折、重叠、随意)3、 扇行幔的计算1、波形幔的计算:(1) 圆波:每个波的成功尺寸0.6——0.7m,实际用量1.8m/个。掉旗:(耳朵)高度一般是窗帘高度的0.3,用料=窗高×0.3×个数。如:(幔)3m宽:3(窗帘宽度)÷0.65(波的宽度)=4.5个(4个波),即波用料:4个×1.8m=7.2m掉旗:2m高:2×0.3 ×2=1.2m则此幅窗帘波形幔共用料:8.4m(2)、半波:可根据窗户的规格及布料的厚薄酌情处理薄型料:每个半波成功尺寸是0.5m,实际开料为料0.9m。如:窗户规格3.3×2.6M=6个波×0.9M+1.8M吊旗=7.2M厚型料:每个半波成功尺寸是0.7m,实际开料为料1.2m。如:窗户规格3.3×2.6M=4个波×1.2 M+1.8M吊旗=6.6M2、直幔的计算:(1) 直板:单层:用料=窗宽+0.1m单色双层:用料=窗宽+0.1m双色双层:用料=(窗宽+0.1m)×2 如:窗户规格3.1×2.5 则:(3.1+0.1)×2=6.4M直板幔的窗帘都可以不用计算腰带用料(2)、折皱(三中形式的算法一样)a、 不对花型:1.1、1.4m窄幅:(窄幅)用料=窗宽+0.1m;(宽幅):用料=(正窗宽度×3倍皱折)÷幅宽×幔高b、 对花型(直板):用料=窗宽×1.5对花型(重叠) :与窄幅正窗一样:窗宽×3÷布料幅宽=幅数(只入不舍);用料=幅数×一组花型的尺寸 一、 荷叶边:荷叶边的宽度:小窗帘(0.12m);大窗帘(0.15m);床罩(0.3m)。副数=需用荷叶边长度×3÷幅宽(只入不舍)用料=幅数×荷叶边宽度如:1×1m 1.4m幅宽(1+0.1)×3=3.3m(直幔花边) 1×2=2m(竖花边)下花边:1×2倍皱折÷1.4=2副料 2×1.4(幅宽)=2.8m(3.3+2+2.8)×3÷.4=17.35(18条花边)18×0.12=2.16m(用料)
⑵ Python科学计算——任意波形拟合
任意波形的生成 (geneartion of arbitrary waveform) 在商业,军事等领域都有着重要的应用,诸如空间光通信 (free-space optics communication), 高速信号处理 (high-speed signal processing),雷达 (radar) 等。在任意波形生成后, 如何评估生成的任意波形 成为另外一个重要的话题。
假设有一组实验数据,已知他们之间的函数关系:y=f(x),通过这些信息,需要确定函数中的一些参数项。例如,f 是一个线型函数 f(x)=k*x+b,那么参数 k 和 b 就是需要确定的值。如果这些参数用 p 表示的话,那么就需要找到一组 p 值使得如下公式中的 S 函数最小:
这种算法被称之为 最小二乘拟合 (least-square fitting)。scipy 中的子函数库 optimize 已经提供实现最小二乘拟合算法的函数 leastsq 。下面是 leastsq 函数导入的方式:
scipy.optimize.leastsq 使用方法
在 Python科学计算——Numpy.genfromtxt 一文中,使用 numpy.genfromtxt 对数字示波器采集的三角波数据导入进行了介绍,今天,就以 4GHz三角波 波形的拟合为案例介绍任意波形的拟合方法。
在 Python科学计算——如何构建模型? 一文中,讨论了如何构建三角波模型。在标准三角波波形的基础上添加了 横向,纵向的平移和伸缩特征参数 ,最后添加了 噪声参数 模拟了三角波幅度参差不齐的随机性特征。但在波形拟合时,并不是所有的特征参数都要纳入考量,例如,噪声参数应是 波形生成系统 的固有特征,正因为它的存在使得产生的波形存在瑕疵,因此,在进行波形拟合并评估时,不应将噪声参数纳入考量,最终模型如下:
在调用 scipy.optimize.leastsq 函数时,需要构建误差函数:
有时候,为了使图片有更好的效果,需要对数据进行一些处理:
leastsq 调用方式如下:
合理的设置 p0 可以减少程序运行时间,因此,可以在运行一次程序后,用拟合后的相应数据对 p0 进行修正。
在对波形进行拟合后,调用 pylab 对拟合前后的数据进行可视化:
均方根误差 (root mean square error) 是一个很好的评判标准,它是观测值与真值偏差的平方和观测次数n比值的平方根,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替.方根误差对一组测量中的特大或特小误差反映非常敏感,所以,均方根误差能够很好地反映出测量的精密度。
RMSE 用程序实现如下:
拟合效果,模型参数输出:
leastsq 函数适用于任何波形的拟合,下面就来介绍一些常用的其他波形:
⑶ 音频算法入门-变音项目
本文主要是基于一个变音项目带大家入门音频算法。项目用到了波形相似叠加算法(Waveform similarity Overlap-Add WSOLA)和重采样算法。wsola能做到变时不变调,重采样是变时也变调,两者结合就能做到变调不变时。项目地址在文章末尾给出。
该算法属于时域法,能做到音频的变时不变调(改变语速但不改变语调)。时域法的基本思路是将音频切分成很小的若干等份,然后每份都去删减一截或者复制一截数据,来减少或增加音频数据,这样就不会改变音频波形,也就不影响音调,最后把每份重新合成播放就达到了变时不变调的目的。但如果只是这么做的话播放出来的声音是有瑕疵的。例如想要加快播放速度,也就是对每份数据删减一截,问题会出在合成的时候,前后两份音频的波形会出现断横,如果是想要减缓播放速度,也就是每份复制一截数据,问题会出在复制后的数据拼接到原数据末尾的时候,拼接处会出现断横。波形相似度叠加算法就是为了优化这个断横问题而提出的。横断如下图所示。
首先介绍几个概念,分别为有效帧,分析帧、搜索窗、重叠区域,合成帧、搜索窗可移动距离。
有效帧:把音频切分成很小的若干等份,每份数据就叫做有效帧。
分析帧:实际分析和处理的时候,仅仅有有效帧是不够的,需要把上个分析帧末尾的一段数据复制并拼接到当前分析帧的头部,这样的一份数据被称为分析帧。分析帧的组成为:analysisFrameLength(分析帧长度) = (有效帧长度)+plicateLengthInAnalysisFrame(重复数据长度)
搜索窗:通过波形相似查找算法在分析帧里截取出的一段数据,数据长度为搜索窗长度,但搜索窗数据并不是直接用于拼接成最终的音频,因为搜索窗里包含重叠区域。
重叠区域:搜索窗数据在处理成最终音频的时候,每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,这块区域叫做重叠区域。
合成帧:由于每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,所以真正用于合成拼接的数据=搜索窗数据-重叠区域,这段数据叫做合成帧。所以播放速度=有效帧/合成帧
搜索窗可移动距离:用上一个搜索窗尾部重叠区域大小的数据(波形数据)作为参考,从当前分析帧头部开始往后平移寻找最相似的数据(相似的波形数据),可平移的最大距离就是搜索窗可移动距离。所以分析帧必须要比搜索窗+搜索窗可移动距离大才行。
熟悉了上面介绍的概念后再来看下面的波形相似度叠加算法示意图,图中展示了两个分析帧变成两个合成帧的完整过程。具体实现细节就看项目吧,主要涉及的操作就是计算波形相似度和叠加这两个相似波形。
重采样分为上采样和下采样,上采样就是增加数据,带来的效果是语速变慢且音调降低,下采样就是减少数据,带来的效果是语速变快且音调提高。所以配合波形相似叠加算法能做到变时不变调。下采样会造成混叠,上采样会造成镜像,想要了解的更细,需要先了解香浓采样定理,然后我推荐一个网址,讲的是上采样和下采样的内容https://www.cnblogs.com/TaigaCon/p/8512219.html。为了让重采样不出现混叠和镜像,本项目用的是窗函数(凯泽窗)设计的sinc低通滤波器进行重采样操作。
低通滤波的目的就是把低频信号保留,把高频信号除去,这相当于把一段音频的频域信号点乘sinc函数傅里叶变换后的频谱函数(该函数的形状请看上图的sinc函数频谱图)。频域点乘又相当于时域卷积,所以又相当于把一段音频时域信号和sinc函数做卷积,但是由于sinc函数在时域上是从负无穷到正无穷的,这就导致没法做卷积,我们观察一下这个sinc函数会发现,离坐标原点越远,曲线上下波动就越小,y值也越接近0,就表示信息量就越少,这时候有人肯定会想到那就裁剪一下,把接近坐标原点的中间这块裁剪下来做卷积。卷积后的结果如下图所示。
看上图会发现不再是标准的矩形函数,两边会有长长的拖尾,而且拖尾的y值还挺大的,这种现象叫做泄露,这不是我们想要的效果,我们还是希望能尽量的接近原来的矩形窗,这就引出了窗函数,对这个sinc函数进行加窗操作(就是裁剪并和窗函数点乘)就可以减少泄露。下面这图就是加了凯泽窗后的sinc函数频谱图
看上图会发现拖尾虽然还是存在,但是拖尾的y值变得更小了,这个效果虽然不是最理想的,但比原来好多了。所以用这个加了窗的sinc函数进行卷积就可以实现低通滤波。那么怎么用这个低通滤波器进行插值呢?请看下图。
为了方便项目的理解,可以先看看这个项目的简单介绍,该项目是先定义了搜索窗大小,搜索窗可移动距离大小和重叠区域大小,然后通过播放速度计算出其他的参数,包括合成帧大小,分析帧大小,有效帧大小和分析帧的重复区域大小。公式如下:
合成帧 = 搜索窗可移动距离重叠区域
有效帧 = 播放速度*(搜索窗-重叠区域)
分析帧 = Math.max(有效帧+重叠区域,搜索窗)+搜索窗可移动距离
分析帧的重复区域 = 分析帧-有效帧
今天春节,是新一年的开端,祝大家在新的一年里付出的努力都能有所收获,年牛大吉!