网站首页 > 文章中心 > 其它

python中去噪函数

作者:小编 更新时间:2023-08-25 13:07:56 浏览量:4人看过

python中的filter函数怎么用

python filter内建函数

filter函数是python内建函数,可以操作任何可迭代类型,如list,tuple,string.

filter需要带上一个函数function和一个可迭代序列作为参数.filter()将调用该function作用于每一个可迭代序列的元素,并返回一个由该function验证后返回值为true的元素组成新的可迭代序列,新序列的类型保持与filter参数序列的类型一致

下面用这个例子来说明:

python中去噪函数-图1

#建个数字列表

def?lessThanFive(element):

print?filter(lessThanFive,?numbers)

下面用如下例子说明:

#定义元组类型

names?=?('Jack',?'Jill,?'Steve',?'')

#筛选出名字

new_names?=?filter(None,?names)

print?new_names

输出结果是元组:

python中去噪函数-图2

('Jack',?'Jill,?'Steve')

在元组names最后一个名字是空字符串,而filter的第一个参数是None,这说明需要使用identity函数(该函数是简单的返回该元素的)

因为python对空字符串,0和None作为False,所以上面的filter的语句就是移除空元素.

目的:找出以J开头的名字

def?startsWithJ(element):

if?element:

return?element[0]?==?'J'

return?False

j_names?=?filter(startsWithJ,?names)

print?j_names

输出结果是元组:('Jack',?'Jill')

Python 简单的扩音,音频去噪,静音剪切

对于任何的音频文件,实际上都是用这种存储方式,比如,下面是对应英文单词"skip"的一段信号(只不过由于点太多,笔者把点用直线连接了起来):

衡量数字信号的 能量(强度) ,只要简单的求振幅平方和即可:

我们知道,声音可以看作是不同频率的正弦信号叠加.那么给定一个声音信号(如上图),怎么能够知道这个信号在不同频率区段上的强度呢?答案是使用离散傅里叶变换.对信号x[n], n=0, ..., N-1,通常记它的离散傅里叶变换为X[n],它是一个复值函数.

比如,对上述英文单词"skip"对应的信号做离散傅里叶变换,得到它在频域中的图像是:

在频域上,也可以计算信号的强度,因为根据Plancherel定理,有:

我们把一种特殊的函数w[n],称作窗函数,如果对所有的n,有0=w[n]=1,且只有有限个n使得w[n]0.比如去噪要用到的汉宁窗,三角窗.

汉宁窗

三角窗

我们将平移的窗函数与原始信号相乘,便得到信号的"一帧":

w[n+d]*x[n]

可见除一有限区间之外,加窗后的信号其他部分都是0.

对一帧信号可以施加离散傅里叶变换(也叫短时离散傅里叶变换),来获取信号在这一帧内(通常是很短时间内),有关频率-能量的分布信息.

如果我们把信号按照上述方法分成一帧一帧,又将每一帧用离散傅里叶变换转换到频域中去,最后将各帧在频域的图像拼接起来,用横坐标代表时间,纵坐标代表频率,颜色代表能量强度(比如红色代表高能,蓝色代表低能),那么我们就构造出所谓 频谱图 .比如上述"skip"发音对应的信号的频谱图是:

从而简单的叠加各帧信号便可以恢复出原始信号:

最后,注意窗函数也可以在频域作用到信号上,从而可以起到取出信号的某一频段的作用.

① 扩音

要扩大信号的强度,只要简单的增大信号的"振幅".比如给定一个信号x[n],用a1去乘,便得到声音更大的增强信号:

同理,用系数0a1去乘,便得到声音变小的减弱信号.

对于白噪音,我们可以简单的用"移动平均滤波器"来去除,虽然这也会一定程度降低声音的强度,但效果的确不错.但是,对于成分较为复杂,特别是频段能量分布不均匀的噪声,则需要使用下面的 噪声门 技术,它可以看作是一种"多带通滤波器".

这个特效的基本思路是:对一段噪声样本建模,然后降低待降噪信号中噪声的分贝.

更加细节的说,是在信号的若干频段f[1], ..., f[M]上,分别设置噪声门g[1], ..., g[M],每个门都有一个对应的阈值,分别是t[1], ..., t[M].这些阈值时根据噪声样本确定的.比如当通过门g[m]的信号强度超过阈值t[m]时,门就会关闭,反之,则会重新打开.最后通过的信号便会只保留下来比噪声强度更大的声音,通常也就是我们想要的声音.

实现中,我们用汉宁窗对信号进行分帧.然后对每一帧,又用三角窗将信号分成若干频段.对噪声样本做这样的处理后,可以求出信号每一频段对应的阈值.然后,又对原始信号做这样的处理(分帧+分频),根据每一帧每一频段的信号强度和对应阈值的差(diff = energy-threshold),来计算对应噪声门的开合程度,即通过信号的强度.最后,简单的将各频段,各帧的通过信号叠加起来,便得到了降噪信号.

比如原先的"skip"语音信号频谱图如下:

可以明显的看到大部分噪音都被清除了,而语音部分仍完好无损,强度也没有减弱,这是"移动平均滤波器"所做不到的.

在对音频进行上述降噪处理后,我们还可以进一步把多余的静音去除掉.

剪切的原理十分简单.首先用汉宁窗对信号做分帧.如果该帧信号强度过小,则舍去该帧.最后将保留的帧叠加起来,便得到了剪切掉静音部分的信号.

比如,对降噪处理后的"skip"语音信号做静音剪切,得到的新信号的频谱图为:

python里的问题 ,pywt.dwt(signal,'db1','sym')这个函数

噪声能获取吗?好吧.你可以试试减一减.不过你的测试用例不太对. 尽量用有规律的数据去做.

比如你可以做一个正弦函数,再人为的加上一点点扰动.再做小波变换看看.另外数据要多些.太短的数据看不出效果来.

python中去噪函数-图3

通常来讲噪声是没有规律的. 但是不排除它是另外一种规律迭加上去的. 试试看.

3种python3的canny边缘检测之静态,可调节和自适应

内容:

①. canny的边缘检测的介绍.

说明:

上述的代码,本机均有报错,故对代码进行修改,注释和运行.

初级canny:

①. 介绍:opencv中给出了canny边缘检测的接口,直接调用:

去噪 -- 梯度 -- 非极大值抑制 -- 滞后阈值

中级canny:

①. 中级canny,就是可调节的阈值,找到最佳的canny边缘检测效果.

高级canny:

①. 自适应canny的算法:

小结:

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章