啸叫抑制(AFS)从算法仿真到工程源码实现-第五节-移频法

一、概述

        该方法在频域进行,对信号进行傅里叶变换,把每个频点的数据下移或上移一个频点,根据我的实践,可以产生一定的效果,但是效果不是很好,而且数据会失真(变调),较小的频移作用不大,较大的频移失真又很严重。

二、算法仿真

2.1 算法流程图

啸叫抑制(AFS)从算法仿真到工程源码实现-第五节-移频法_第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()

三、总结

        本节使用移频法对啸叫进行抑制,效果不佳。下来几节我们将使用陷波法和自适应滤波的方法进行仿真。

你可能感兴趣的:(语音信号处理,算法)