예제 #1
0
    print("STFT calc done!")
    print("    n_bins               = ", n_bins)
    print("    n_sensors            = ", n_sensors)
    print("    stft_noise_arr.shape = ", stft_noise_arr.shape)
    print("    stft_mix_arr.shape   = ", stft_mix_arr.shape)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    print('    (angle_inf_h, angle_inf_v) = ', angle_inf_h, angle_inf_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    source_position_inf = get_source_position(angle_inf_h,
                                              angle_inf_v,
                                              radius=6.0)

    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)
    d_arr_inf = propagation_vector_free_field(sensor_positions,
                                              source_position_inf,
                                              N_fft=n_fft,
                                              F_s=sr)

    #################################################################
    # 4 - NULL filter output
예제 #2
0
def main():

    # #################################################################
    # # 1.0 - LANDA PROFILE
    # vert_mic_count = 1
    # hor_mic_count  = 8
    # dHor           = 0.05
    # dVert          = 0.05
    # max_len_sec    = 60
    # n_fft          = 512
    # n_overlap      = 2
    #
    # (angle_hor_log, angle_vert_log) = (16.0, 0.0)
    # angle_h = -angle_hor_log
    # angle_v = -angle_vert_log
    #
    # _mix_start     = 17
    # _mix_end       = 40
    #
    # in_wav_path    = r'./data/_landa/'
    # out_wav_path   = r'./data/out/'
    # #################################################################

    #################################################################
    # 1.0 - _du_hast PROFILE

    #vert_mic_count = 6
    #hor_mic_count  = 11

    vert_mic_count = 1
    hor_mic_count = 11
    dHor = 0.035
    dVert = 0.05
    max_len_sec = 45

    n_fft = 512
    n_overlap = 2

    (angle_hor_log, angle_vert_log) = (12.051, 5.88161)
    angle_h = -angle_hor_log
    angle_v = -angle_vert_log

    _mix_start = 17
    _mix_end = 40

    in_wav_path = r'./data/_du_hast/'
    out_wav_path = r'./data/out/'
    #################################################################

    #################################################################
    # 1.0 - Read signal
    x_all_arr, sr = read_mic_wav_from_folder(in_wav_path,
                                             vert_mic_count,
                                             hor_mic_count,
                                             max_len_sec=max_len_sec)
    x_all_arr = x_all_arr[:, (np.int32)(_mix_start * sr):(np.int32)(_mix_end *
                                                                    sr)]
    (n_channels, n_samples) = x_all_arr.shape

    print("Array data read done!")
    print("    n_channels  = ", n_channels)
    print("    n_samples   = ", n_samples)
    print("    freq        = ", sr)

    #################################################################
    # 2 - Do STFT
    stft_all = stft_arr(x_all_arr, fftsize=n_fft, overlap=n_overlap)
    (n_bins, n_sensors, n_frames) = stft_all.shape

    print("STFT calc done!")
    print("    n_bins     = ", n_bins)
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)

    #################################################################
    # Reshape to (nframes, nfrequencies, nchannels)
    M_spec = stft_all.transpose((2, 0, 1))

    def callback_fn(X):
        print('    invoke callback_fn')

    # #(nfrequencies, nchannels, nchannels)
    # W = np.array([np.eye(n_sensors, n_sensors) for f in range(n_bins)], dtype=M_spec.dtype)
    # for i in range(n_bins):
    #     W[i, : , 0 ] = d_arr[:, i]/8.0
    # Y = np.zeros((n_frames, n_bins, n_sensors), dtype=M_spec.dtype)
    # def demix(Y, X, W):
    #     for f in range(n_bins):
    #         Y[:,f,:] = np.dot(X[:,f,:], np.conj(W[f,:,:]))
    # demix(Y, M_spec, W)

    # # IVA Demix
    Y = pyroomacoustics.bss.auxiva(M_spec,
                                   n_iter=20,
                                   proj_back=True,
                                   callback=callback_fn)

    # Save result
    for i in range(Y.shape[2]):
        sig_out = istft(Y[:, :, i], overlap=n_overlap)
        sf.write(r'out/iva_res_{}.wav'.format(i), sig_out, sr)
예제 #3
0
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector and PSD matrix
    print('Calc  steering vector!')

    # mus MicGridProcessor::SetDirectionAngles, angleFiHorz = 24.7455, angleFiVert = 18.2763
    # sp MicGridProcessor::SetDirectionAngles, angleFiHorz = -30.9141, angleFiVert = 12.483

    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_Hor=30.9,
                                          angle_Vert=-12.48,
                                          radius=6.0)
    d_arr_1 = propagation_vector_free_field(sensor_positions,
                                            source_position,
                                            N_fft=n_fft,
                                            F_s=sr)

    source_position = get_source_position(angle_Hor=-24.7,
                                          angle_Vert=-18.27,
                                          radius=6.0)
    d_arr_2 = propagation_vector_free_field(sensor_positions,
                                            source_position,
                                            N_fft=n_fft,
                                            F_s=sr)

    psd_1 = np.einsum('i...,j...->...ij', d_arr_1, d_arr_1.conj())
예제 #4
0
    angle_step = 1

    print("Begin steering calc ...")
    arr_angle_h = range(-90, 90, angle_step)
    angle_v = 0.0
    arr_d_arr = np.zeros((len(arr_angle_h), n_sensors, n_bins),
                         dtype=np.complex)

    print('arr_d_arr = ', arr_d_arr.shape)

    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(30, angle_v)
    d_arr_inf = propagation_vector_free_field(sensor_positions,
                                              source_position,
                                              N_fft=n_fft,
                                              F_s=sr)

    d_arr_inf_h_der = get_der_steering_2(sensor_positions, source_position,
                                         512, 16000, 30, angle_v)

    for i, angle_h in enumerate(arr_angle_h):
        sensor_positions = get_sensor_positions(hor_mic_count,
                                                vert_mic_count,
                                                dHor=dHor,
                                                dVert=dVert)
        source_position = get_source_position(angle_h, angle_v)
        arr_d_arr[i, :, :] = propagation_vector_free_field(sensor_positions,
예제 #5
0
    (n_bins, n_sensors, n_frames) = stft_all.shape

    print("STFT calc done!")
    print("    n_bins     = ", n_bins)
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)

    #################################################################
    # 4  - Calc psd matrix
    mask = np.load(
        r'D:\REP\svn_MicArrAlgorithm2\MA_PY\out\result_sol\mask_ds.npy')

    # bin x frames x mask
    mask = np.transpose(mask, (1, 0, 2))
    actual_mask = mask[:, 0:n_frames, 0]

    stft_all_noise = copy.deepcopy(stft_all)
예제 #6
0
def run_once():

    # #################################################################
    # # 1.0 - _wav_wbn45_dict0 PROFILE
    #
    # vert_mic_count = 6
    # hor_mic_count  = 11
    # dHor           = 0.035
    # dVert          = 0.05
    # max_len_sec    = 45
    # n_fft          = 512
    #
    # (angle_hor_log, angle_vert_log) = (0.0, 0.0)
    # (angle_inf_hor_log, angle_inf_vert_log) = (45, 0)
    #
    # angle_h = -angle_hor_log
    # angle_v = -angle_vert_log
    #
    # angle_inf_h = -angle_inf_hor_log
    # angle_inf_v = -angle_inf_vert_log
    #
    # angle_h = -angle_hor_log
    # angle_v = -angle_vert_log
    #
    # _mix_start     = 0.0
    # _mix_end       = 20.0
    #
    # in_wav_path    = r'./data/_wav_wbn45_dict0/'
    # out_wav_path   = r'./data/out/'
    # #################################################################

    # #################################################################
    # 1.0 - _sol PROFILE MVDR
    vert_mic_count = 6
    hor_mic_count = 11
    dHor = 0.035
    dVert = 0.05
    max_len_sec = 3 * 60
    n_fft = 512

    (angle_hor_log, angle_vert_log) = (13.8845, 6.60824)
    (angle_inf_hor_log, angle_inf_vert_log) = (-15.06, -0.31)

    angle_h = -angle_hor_log
    angle_v = -angle_vert_log

    angle_inf_h = -angle_inf_hor_log
    angle_inf_v = -angle_inf_vert_log

    in_wav_path = r'./data/_sol/'
    out_wav_path = r'./data/out/'

    _mix_start = 28
    _mix_end = 48
    #################################################################

    #################################################################
    # 1.0 - Read signal
    x_all_arr, sr = read_mic_wav_from_folder(in_wav_path,
                                             vert_mic_count,
                                             hor_mic_count,
                                             max_len_sec=max_len_sec)
    x_all_arr = x_all_arr[:, (np.int32)(_mix_start * sr):(np.int32)(_mix_end *
                                                                    sr)]

    (n_channels, n_samples) = x_all_arr.shape
    print("Array data read done!")
    print("    n_channels  = ", n_channels)
    print("    n_samples   = ", n_samples)
    print("    freq        = ", sr)

    #################################################################
    # 2 - Do STFT
    stft_all = stft_arr(x_all_arr, fftsize=n_fft)
    (n_bins, n_sensors, n_frames) = stft_all.shape

    print("STFT calc done!")
    print("    n_bins     = ", n_bins)
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    print('    (angle_inf_h, angle_inf_v) = ', angle_inf_h, angle_inf_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    source_position_inf = get_source_position(angle_inf_h,
                                              angle_inf_v,
                                              radius=6.0)

    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)
    d_arr_inf = propagation_vector_free_field(sensor_positions,
                                              source_position_inf,
                                              N_fft=n_fft,
                                              F_s=sr)

    #################################################################
    # 4 - Calc DS beamforming in desired and noise direction
    result_spec = ds_beamforming(stft_all, d_arr.T)
    result_spec_inf = ds_beamforming(stft_all, d_arr_inf.T)

    #################################################################
    # 5 - ISTFT
    sig_sp = istft(result_spec.transpose((1, 0)), overlap=2)
    sig_inf = istft(result_spec_inf.transpose((1, 0)), overlap=2)

    sf.write(r"out/out_ds_sp.wav", sig_sp, sr)
    sf.write(r"out/out_ds_inf.wav", sig_inf, sr)

    #################################################################
    # 4 - NULL filter output
    result_spec, _ = null_filter(stft_all,
                                 d_arr_sp=d_arr.T,
                                 d_arr_inf=d_arr_inf.T)
    sig_out = istft(result_spec.transpose((1, 0)), overlap=2)
    sf.write(r"out/out_null.wav", sig_out, sr)

    #result_spec, _ = null_filter_ex(stft_mix_arr, d_arr_sp=d_arr.T, lst_d_arr_inf=[d_arr_inf.T, d_arr_inf_d1.T, d_arr_inf_d2.T])

    # #################################################################
    # # 6 - AP filter
    # M = 200
    # step = 0.05
    # L = 5
    # sig_result =  affine_projection_filter(main=sig_sp, ref=sig_inf, M=M,step=step,L=5)

    #################################################################
    # 6.1 - AP filter + cyclic parameters
    # M = 200
    # step = 0.05
    # L = 5
    # leak = 0.0
    # delay = -5

    #params = [(200, 0.005, 5), (200, 0.05, 5), (200, 0.1, 5), (200, 0.5, 5)]
    #params = [(200, 0.005, 5),(200, 0.005, 11), (200, 0.005, 25) , (200, 0.005, 35)]

    params = [(100, 0.01, 5, 0.01, -5)]
    for (M, step, L, leak, delay) in params:
        print("process     M = {}, step = {}, L = {}, leak = {}, dealy = {}".
              format(M, step, L, leak, delay))
        sig_inf = np.roll(sig_inf, delay)
        sig_result = affine_projection_filter(main=sig_sp,
                                              ref=sig_inf,
                                              M=M,
                                              step=step,
                                              L=L,
                                              leak=leak)
        sf.write(
            r"out/out_ap_null_M_{}_step_{}_L_{}_leak_{}_delay_{}.wav".format(
                M, step, L, leak, delay), sig_result, sr)

        sdr_impr, sir_impr, sar_impr, sdr_base, sir_base, sar_base = calc_sdr_impr_metric(
            ref_sp, ref_mus, mix, sig_result)

        print(base_name)
        print(
            "sdr_impr, sir_impr, sar_impr  =  {}, {}, {},  sdr_base, sir_base, sar_base  =  {}, {}, {}\n"
            .format(sdr_impr, sir_impr, sar_impr, sdr_base, sir_base,
                    sar_base))
예제 #7
0
    print("STFT calc done!")
    print("    n_bins               = ", n_bins)
    print("    n_sensors            = ", n_sensors)
    print("    stft_noise_arr.shape = ", stft_noise_arr.shape)
    print("    stft_mix_arr.shape   = ", stft_mix_arr.shape)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    print('    (angle_inf_h, angle_inf_v) = ', angle_inf_h, angle_inf_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    source_position_inf = get_source_position(angle_inf_h,
                                              angle_inf_v,
                                              radius=6.0)

    source_position_inf_d1 = get_source_position(angle_inf_h + 3.0,
                                                 angle_inf_v,
                                                 radius=6.0)
    source_position_inf_d2 = get_source_position(angle_inf_h - 3.0,
                                                 angle_inf_v,
                                                 radius=6.0)

    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)
예제 #8
0
def params_iterate_null():

    #base_name = 'out_mus1_spk1_snr_-10'
    base_name = 'out_wgn_spk_snr_-10'

    config = cfg.ConfigParser()
    config.read(os.path.join(r'./data/_sdr_test', base_name, 'config.cfg'))

    in_Main = r'./data/_sdr_test/' + base_name + r'/ds_mix.wav'
    in_Main_Sp = r'./data/_sdr_test/' + base_name + r'/ds_spk.wav'
    in_Main_Mus = r'./data/_sdr_test/' + base_name + r'/ds_mus.wav'

    # #################################################################
    # 1.0 - read PROFILE
    vert_mic_count = int(config['MIC_CFG']['vert_mic_count'])
    hor_mic_count = int(config['MIC_CFG']['hor_mic_count'])
    dHor = float(config['MIC_CFG']['dhor'])
    dVert = float(config['MIC_CFG']['dvert'])
    max_len_sec = int(config['MIC_CFG']['max_len_sec'])
    n_fft = int(config['MIC_CFG']['fft_size'])

    angle_h = -float(config['FILTER_CFG']['angle_h'])
    angle_v = -float(config['FILTER_CFG']['angle_v'])
    angle_inf_h = -float(config['FILTER_CFG']['angle_inf_h'])
    angle_inf_v = -float(config['FILTER_CFG']['angle_inf_v'])

    in_wav_path = r'./data/_sdr_test/' + base_name + r'/mix'
    out_wav_path = r'./data/out/'

    _mix_start = float(config['FILTER_CFG']['start_mix_time'])
    _mix_end = 30
    #################################################################

    #################################################################
    # 1.0 - Read signal
    x_all_arr, sr = read_mic_wav_from_folder(in_wav_path,
                                             vert_mic_count,
                                             hor_mic_count,
                                             max_len_sec=max_len_sec)

    ref_sp, _ = sf.read(in_Main_Sp)
    ref_mus, _ = sf.read(in_Main_Mus)
    mix, _ = sf.read(in_Main)

    x_all_arr = x_all_arr[:, (np.int32)(_mix_start * sr):(np.int32)(_mix_end *
                                                                    sr)]

    ref_sp = ref_sp[:(np.int32)((_mix_end - _mix_start) * sr)]
    ref_mus = ref_mus[:(np.int32)((_mix_end - _mix_start) * sr)]
    mix = mix[(np.int32)(_mix_start * sr):(np.int32)(_mix_end * sr)]

    (n_channels, n_samples) = x_all_arr.shape
    print("Array data read done!")
    print("    n_channels  = ", n_channels)
    print("    n_samples   = ", n_samples)
    print("    freq        = ", sr)

    #################################################################
    # 2 - Do STFT
    stft_all = stft_arr(x_all_arr, fftsize=n_fft)
    (n_bins, n_sensors, n_frames) = stft_all.shape

    print("STFT calc done!")
    print("    n_bins     = ", n_bins)
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    print('    (angle_inf_h, angle_inf_v) = ', angle_inf_h, angle_inf_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    source_position_inf = get_source_position(angle_inf_h,
                                              angle_inf_v,
                                              radius=6.0)

    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)
    d_arr_inf = propagation_vector_free_field(sensor_positions,
                                              source_position_inf,
                                              N_fft=n_fft,
                                              F_s=sr)

    #################################################################
    # 4 - Calc DS beamforming in desired and noise direction
    result_spec = ds_beamforming(stft_all, d_arr.T)
    result_spec_inf = ds_beamforming(stft_all, d_arr_inf.T)

    #################################################################
    # 5 - ISTFT
    sig_sp = istft(result_spec.transpose((1, 0)), overlap=2)
    sig_inf = istft(result_spec_inf.transpose((1, 0)), overlap=2)

    sf.write(r"out/out_ds_sp.wav", sig_sp, sr)
    sf.write(r"out/out_ds_inf.wav", sig_inf, sr)

    #################################################################
    # 5.1 - NULL filter + cyclic parameters
    out_spec, _ = null_filter(stft_all,
                              d_arr_sp=d_arr.T,
                              d_arr_inf=d_arr_inf.T)
    sig_out = istft(out_spec.transpose((1, 0)), overlap=2)
    sf.write(r"out/out_null.wav", sig_out, sr)

    #result_spec, _ = null_filter_ex(stft_mix_arr, d_arr_sp=d_arr.T, lst_d_arr_inf=[d_arr_inf.T, d_arr_inf_d1.T, d_arr_inf_d2.T])

    sdr_impr, sir_impr, sar_impr, sdr_base, sir_base, sar_base = calc_sdr_impr_metric(
        ref_sp, ref_mus, mix, sig_out)

    print(base_name)
    print(
        "sdr_impr, sir_impr, sar_impr  =  {}, {}, {},  sdr_base, sir_base, sar_base  =  {}, {}, {}\n"
        .format(sdr_impr, sir_impr, sar_impr, sdr_base, sir_base, sar_base))
    print('---------------------------------------------')
예제 #9
0
def params_iterate():

    base_name = 'out_mus1_spk1_snr_-10'
    #base_name = 'out_wgn_spk_snr_-10'

    config = cfg.ConfigParser()
    config.read(os.path.join(r'./data/_sdr_test', base_name, 'config.cfg'))

    in_Main = r'./data/_sdr_test/' + base_name + r'/ds_mix.wav'
    in_Main_Sp = r'./data/_sdr_test/' + base_name + r'/ds_spk.wav'
    in_Main_Mus = r'./data/_sdr_test/' + base_name + r'/ds_mus.wav'

    # #################################################################
    # 1.0 - read PROFILE
    vert_mic_count = int(config['MIC_CFG']['vert_mic_count'])
    hor_mic_count = int(config['MIC_CFG']['hor_mic_count'])
    dHor = float(config['MIC_CFG']['dhor'])
    dVert = float(config['MIC_CFG']['dvert'])
    max_len_sec = int(config['MIC_CFG']['max_len_sec'])
    n_fft = int(config['MIC_CFG']['fft_size'])

    angle_h = -float(config['FILTER_CFG']['angle_h'])
    angle_v = -float(config['FILTER_CFG']['angle_v'])
    angle_inf_h = -float(config['FILTER_CFG']['angle_inf_h'])
    angle_inf_v = -float(config['FILTER_CFG']['angle_inf_v'])

    in_wav_path = r'./data/_sdr_test/' + base_name + r'/mix'
    out_wav_path = r'./data/out/'

    _mix_start = float(config['FILTER_CFG']['start_mix_time'])
    _mix_end = 30
    #################################################################

    #################################################################
    # 1.0 - Read signal
    x_all_arr, sr = read_mic_wav_from_folder(in_wav_path,
                                             vert_mic_count,
                                             hor_mic_count,
                                             max_len_sec=max_len_sec)

    ref_sp, _ = sf.read(in_Main_Sp)
    ref_mus, _ = sf.read(in_Main_Mus)
    mix, _ = sf.read(in_Main)

    x_all_arr = x_all_arr[:, (np.int32)(_mix_start * sr):(np.int32)(_mix_end *
                                                                    sr)]

    ref_sp = ref_sp[:(np.int32)((_mix_end - _mix_start) * sr)]
    ref_mus = ref_mus[:(np.int32)((_mix_end - _mix_start) * sr)]
    mix = mix[(np.int32)(_mix_start * sr):(np.int32)(_mix_end * sr)]

    (n_channels, n_samples) = x_all_arr.shape
    print("Array data read done!")
    print("    n_channels  = ", n_channels)
    print("    n_samples   = ", n_samples)
    print("    freq        = ", sr)

    #################################################################
    # 2 - Do STFT
    stft_all = stft_arr(x_all_arr, fftsize=n_fft)
    (n_bins, n_sensors, n_frames) = stft_all.shape

    print("STFT calc done!")
    print("    n_bins     = ", n_bins)
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    print('    (angle_inf_h, angle_inf_v) = ', angle_inf_h, angle_inf_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    source_position_inf = get_source_position(angle_inf_h,
                                              angle_inf_v,
                                              radius=6.0)

    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)
    d_arr_inf = propagation_vector_free_field(sensor_positions,
                                              source_position_inf,
                                              N_fft=n_fft,
                                              F_s=sr)

    #################################################################
    # 4 - Calc DS beamforming in desired and noise direction
    result_spec = ds_beamforming(stft_all, d_arr.T)
    result_spec_inf = ds_beamforming(stft_all, d_arr_inf.T)

    #################################################################
    # 5 - ISTFT
    sig_sp = istft(result_spec.transpose((1, 0)), overlap=2)
    sig_inf = istft(result_spec_inf.transpose((1, 0)), overlap=2)

    sf.write(r"out/out_ds_sp.wav", sig_sp, sr)
    sf.write(r"out/out_ds_inf.wav", sig_inf, sr)

    #################################################################
    # 6.1 - AP filter + cyclic parameters
    # M = 200
    # step = 0.05
    # L = 5
    # leak = 0.0
    # delay = -5

    params = [
        #(150, 0.005, 5, 0.001, 0),
        (150, 0.005, 5, 0.001, 0),
        (200, 0.05, 5, 0.001, 0),
    ]

    for (M, step, L, leak, delay) in params:
        print("process     M = {}, step = {}, L = {}, leak = {}, delay = {}".
              format(M, step, L, leak, delay))
        sig_inf = np.roll(sig_inf, delay)

        sig_result = affine_projection_filter(main=sig_sp,
                                              ref=sig_inf,
                                              M=M,
                                              step=step,
                                              L=L,
                                              leak=leak)
        sf.write(
            r"out/out_ap_null_M_{}_step_{}_L_{}_leak_{}_delay_{}.wav".format(
                M, step, L, leak, delay), sig_result, sr)

        sdr_impr, sir_impr, sar_impr, sdr_base, sir_base, sar_base = calc_sdr_impr_metric(
            ref_sp, ref_mus, mix, sig_result)

        print(base_name)
        print(
            "sdr_impr, sir_impr, sar_impr  =  {}, {}, {},  sdr_base, sir_base, sar_base  =  {}, {}, {}\n"
            .format(sdr_impr, sir_impr, sar_impr, sdr_base, sir_base,
                    sar_base))
        print('---------------------------------------------')
예제 #10
0
def do_ds():
    #################################################################
    # 1.0 - out_mus1_spk1_snr_-10 PROFILE

    vert_mic_count = 6
    hor_mic_count = 11
    dHor = 0.035
    dVert = 0.05
    max_len_sec = 60
    n_fft = 512

    # (angle_hor_log, angle_vert_log) = (7.1539, 7.39515)
    (angle_hor_log, angle_vert_log) = (-16.0721, -0.163439)

    angle_h = -angle_hor_log
    angle_v = -angle_vert_log

    _mix_start = 10
    _mix_end = 50

    in_wav_path = r'./data/_sdr_test/out_mus1_spk1_snr_-15/mix/'
    out_wav_path = r'./data/out/'
    #################################################################

    #################################################################
    # 1.0 - Read signal
    x_all_arr, sr = read_mic_wav_from_folder(in_wav_path,
                                             vert_mic_count,
                                             hor_mic_count,
                                             max_len_sec=max_len_sec)
    x_all_arr = x_all_arr[:, (np.int32)(_mix_start * sr):(np.int32)(_mix_end *
                                                                    sr)]

    (n_channels, n_samples) = x_all_arr.shape

    print("Array data read done!")
    print("    n_channels  = ", n_channels)
    print("    n_samples   = ", n_samples)
    print("    freq        = ", sr)

    #################################################################
    # 2 - Do STFT
    stft_all = stft_arr(x_all_arr, fftsize=n_fft)
    (n_bins, n_sensors, n_frames) = stft_all.shape

    print("STFT calc done!")
    print("    n_bins     = ", n_bins)
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)

    #################################################################
    # 4 - Calc DS filter output
    result_spec = ds_beamforming(stft_all, d_arr.T)

    #################################################################
    # 5 inverse STFT and save
    sig_out = istft(result_spec.transpose((1, 0)), overlap=2)
    sf.write(r"out/out_DS.wav", sig_out, sr)
예제 #11
0
    (n_bins, n_sensors, n_frames) = stft_mix.shape

    print("STFT calc done!")
    print("    n_bins     = ", n_bins)
    print("    n_sensors  = ", n_sensors)
    print("    n_frames   = ", n_frames)

    #################################################################
    # 3 - Calc  steering vector
    print('Calc  steering vector!')
    print('    (angle_h, angle_v) = ', angle_h, angle_v)
    sensor_positions = get_sensor_positions(hor_mic_count,
                                            vert_mic_count,
                                            dHor=dHor,
                                            dVert=dVert)
    source_position = get_source_position(angle_h, angle_v, radius=6.0)
    d_arr = propagation_vector_free_field(sensor_positions,
                                          source_position,
                                          N_fft=n_fft,
                                          F_s=sr)

    source_position_noise = get_source_position(angle_h_noise,
                                                angle_v_noise,
                                                radius=6.0)
    d_arr_noise = propagation_vector_free_field(sensor_positions,
                                                source_position_noise,
                                                N_fft=n_fft,
                                                F_s=sr)

    #################################################################
    # 4 - Calc filter output
예제 #12
0
    (n_bins, n_sensors, n_frames) = stft_mix_arr.shape

    print ("STFT calc done!")
    print ("    n_bins               = ", n_bins)
    print ("    n_sensors            = ", n_sensors)
    print ("    stft_noise_arr.shape = ", stft_noise_arr.shape)
    print ("    stft_mix_arr.shape   = ", stft_mix_arr.shape)


    #################################################################
    # 3.0 - Calc  steering vector for null direction

    angle_null_h = -30.0
    angle_null_v = -0.0
    sensor_positions     = get_sensor_positions(hor_mic_count, vert_mic_count, dHor=dHor, dVert=dVert)
    source_position_null = get_source_position(angle_null_h, angle_null_v, radius=6.0)
    source_position_null_d1 = get_source_position(angle_null_h + 3.0, angle_null_v, radius=6.0)
    source_position_null_d2 = get_source_position(angle_null_h - 3.0, angle_null_v, radius=6.0)

    d_arr_null           = propagation_vector_free_field(sensor_positions, source_position_null, N_fft = n_fft, F_s = sr)
    d_arr_null_d1        = propagation_vector_free_field(sensor_positions, source_position_null_d1, N_fft = n_fft, F_s = sr)
    d_arr_null_d2        = propagation_vector_free_field(sensor_positions, source_position_null_d2, N_fft = n_fft, F_s = sr)

    #################################################################
    # 3.1 - Calc  steering vector

    angle_step = 1

    print ("Begin steering calc ...")
    arr_angle_h = range(-90, 90, angle_step)
    angle_v     = 0.0