我目前正在喀拉拉邦创建一个网络,以使用中值滤波技术(http://dafx10.iem.at/papers/DerryFitzGerald_DAFx10_P15.pdf)对音频频谱图执行谐波/打击乐源分离。
给出输入幅度谱图 S ,并将第 i 个时间范围表示为 S i ,然后第 h 个频率切片为 S h ,这是一个打击乐增强的频谱图框架, P i 可以通过对 S i 进行中值滤波来生成: P i = M { S i , l perc },其中 M 表示中值滤波, l perc 是过滤器长度。然后将各个打击乐增强帧 P i 组合在一起,以生成一个打击乐增强频谱图 P 。类似地,可以通过中值滤波频率切片 S h 获得谐波增强的频谱图频率切片 H h : H i = M { S h , l 伤害}。
一旦您拥有 P 和 H ,您就可以查看每个频箱 S h,i 是否属于谐波或打击乐来源:如果 H h,i > P h,i , S h,i 进入谐波频谱图,并在打击乐频谱图中取值为0,反之亦然。
在我的网络中,给定输入频谱图并在特定时间范围 S i 中,我需要水平计算每个频率h的中值。这可以通过lambda层和tensorflow轻松完成:
layer_H = Lambda(lambda x:tf.contrib.distributions.percentile(x[0], 50, axis=0))(layer)
在这里,谐波中值滤波器 l harm 的长度是输入频谱图的水平长度。输出是一个向量,其大小等于频率数(在我的情况下为88)。
下一步是我现在所处的位置:鉴于敲击中位数的长度,我需要垂直计算当前时间段 S i 的中位数过滤 l perc ,并知道我希望结果矢量的大小与输入的大小相同,因此我必须注意输入的每一端(过滤器的大小将在 l harm 和 l harm / 2之间,具体取决于我们所在的位置) 。由于缺少更好的词,这看起来有点像卷积。
一旦有了两个结果向量 H i 和 P i ,我想将它们进行比较将原始帧 S i 的每个值分配给打击乐层( L p )或调和层( L h )。因此,我有三个不同的输入, H i , P i 和 S 我想以 L p 和 L h 结尾比较 H i 和 P i ,然后继续从那里构建我的网络。如果 H i,j > P i,j ,则 L p < sub> i,j = 0和 L h i,j = S i,j 。
总而言之,我陷入了两个不同的问题:
如何计算水平中位数?
如何在网络中实施允许我从 H i , P i 和 S i 到 L p 和 L h 吗?
非常感谢您!