啸叫抑制(AFS)从算法仿真到工程源码实现-第五节-移频法
频移法去啸叫
·
一、概述
该方法在频域进行,对信号进行傅里叶变换,把每个频点的数据下移或上移一个频点,根据我的实践,可以产生一定的效果,但是效果不是很好,而且数据会失真(变调),较小的频移作用不大,较大的频移失真又很严重。
二、算法仿真
2.1 算法流程图

2.2 算法仿真代码
import os
import time
import struct
import numpy as np
import logging
# node1
def TestIFIO():
input_file = "/tmp/node2_to_node1.tmp"
output_file = "/tmp/node1_to_node2.tmp"
# 1.create fifo
if not os.path.exists(input_file):
os.mkfifo(input_file, 0o666)
# 2.open pipe
print('init read pipe: ' + input_file)
fin = os.open(input_file, os.O_RDONLY)
fout = os.open(output_file, os.O_WRONLY)
x = np.zeros(shape=(2*128), dtype=np.float32)
out = np.zeros(shape=(128), dtype=np.float32)
window = np.hamming(2*128)
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
while True:
recv_str = os.read(fin, 256)
logging.debug("recv: {}".format(len(recv_str)))
chunk_data = recv_str
count = len(chunk_data)/2
short_data = struct.unpack('h'*int(count), chunk_data)
x = np.concatenate([x[128:], short_data])
w_data = x * window
fft_data = np.fft.rfft(w_data, 512)
nums = len(fft_data)
tmp0 = fft_data[nums-1]
for i in range(len(fft_data)-1):
fft_data[nums-i-1] = fft_data[nums-i-2]
fft_data[0] = tmp0
ifft_data = np.fft.irfft(fft_data, 512)
ifft_data = ifft_data[:256]
short_data = ifft_data[:128] + out
out = ifft_data[128:]
short_array = (np.array(short_data)).astype(np.int16)
recv_str = short_array.tobytes()
xx = os.write(fout, recv_str)
logging.debug("write: {}".format(xx))
#time.sleep(0.5)
os.close(fin)
os.close(fout)
if __name__ == '__main__':
TestIFIO()
三、总结
本节使用移频法对啸叫进行抑制,效果不佳。下来几节我们将使用陷波法和自适应滤波的方法进行仿真。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)