################################################################# # 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 - DS filter result_spec = ds_beamforming(stft_mix, d_arr.T) # 5 - inverse STFT and save sig_out = istft(result_spec.transpose((1, 0)), overlap=2) out_ds_path = r'{}/tmp_ds.wav'.format(os.path.dirname(out_wav_path)) sf.write(out_ds_path, sig_out, sr) # 6 - get noise mask print('Get noise mask form neural net!') # shape - (time, freq, 2) config_path = r'/home/stc/MA_ALG/datasets/test_ma/' \ r'chimera_v12/9_chimera.json' in_model_path = r'/home/stc/MA_ALG/datasets/test_ma/chimera_v12/checkpoint/' frozen_model_path = r'/home/stc/MA_ALG/datasets/test_ma/chimera_frozen/model_chimera_v11.pb'
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('---------------------------------------------')
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))
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 RTF steering vector print('Calc RTF steering vector!') #result_spec_rtf = rtf_filter(stft_mix, stft_chirp_sp_arr, 'simple') result_spec_rtf = rtf_filter(stft_mix, stft_chirp_noise_arr, 'simple') ################################################################# # 5 - Do DS beamforming result_sp = ds_beamforming(stft_mix, d_arr.T) result_noise = ds_beamforming(stft_mix, d_arr_inf.T) ################################################################# # 5 - Write result sig_out = istft(result_spec_rtf.transpose((1, 0)), overlap=n_overlap) sf.write(r"out/out_DS_rtf.wav", sig_out, sr) sig_out = istft(result_sp.transpose((1, 0)), overlap=n_overlap) sf.write(r"out/out_DS_sp.wav", sig_out, sr) sig_out = istft(result_noise.transpose((1, 0)), overlap=n_overlap) sf.write(r"out/out_DS_noise.wav", sig_out, sr)
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('---------------------------------------------')
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 - MCRA postfilter result_spec = mcra_filter(stft_arr=result_spec) ################################################################# # 5 inverse STFT and save sig_out = istft(result_spec.transpose((1,0)), overlap = 2) sf.write(r"out/out_DS_MCRA.wav", sig_out, sr)
# sf.write(r"out/out_HARD_NULL_{}.wav".format(alg_type), sig_out, sr) # else: # # ################################################################# # # 4 - HARD NULL filter output # alg_type = 2 #0-compensate ref, 1-spec subs, 2- SMB filter # result_spec = hard_null_filter(stft_all, d_arr_sp=d_arr, d_arr_inf=d_arr_inf, alg_type=alg_type) # # ################################################################# # # 5 - Inverse STFT and save # sig_out = istft(result_spec.transpose((1,0)), overlap = 2) # sf.write(r"out/out_HARD_NULL_{}.wav".format(alg_type), sig_out, sr) (n_bins, n_num_sensors, n_frames) = stft_all.shape spec_sp = ds_beamforming(stft_all, d_arr.T) spec_inf = ds_beamforming(stft_all, d_arr_inf.T) gain_correction = np.zeros((n_bins), dtype=np.complex) for i in range(n_bins): d1 = d_arr[:, i] d2 = d_arr_inf[:, i] eq_i = np.dot(np.conj(d2), d1) gain_correction[i] = eq_i / n_sensors spec_corr_inf = np.expand_dims(gain_correction, axis=1) * spec_inf #result_spec = spectral_substract_filter(stft_main=spec_sp, stft_ref=spec_inf, alfa_PX=0.01, alfa_PN=0.099) result_spec = spectral_substract_filter(stft_main=spec_sp, stft_ref=spec_corr_inf,
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)
################################################################# # 3 - Calc map POW = np.zeros((len(arr_angle_h), len(arr_angle_v))) print("Begin calc map ...") col = 0 for k in range(0, n_frames, frame_step): print("Process frame {} .. {}, max {}".format(k, k + frame_step, n_frames)) for i, angle_h in enumerate(arr_angle_h): for j, angle_v in enumerate(arr_angle_v): d_arr = arr_d_arr[i, j, :, :] # 4 - Do beamforming inst_spec = ds_beamforming(stft_arr[:, :, k:k + frame_step], d_arr.T) inst_pow = np.sum(inst_spec**2) / frame_step POW[i, j] = inst_pow # Display matrix plt.matshow(POW.T) plt.savefig('./out/png/mic_{}.png'.format(col)) plt.close() col += 1 print("Calc map done!") ################################################################# # 4 - Do align #align_stft_arr = ds_align(stft_arr, d_arr.T)
def ds_respk(): # ################################################################# # 1.0 - AMI dataset small session n_fft = 512 n_overlap = 2 r_circular_array = 0.1 mic_count = 8 in_wav_path = r'./data/_ami_data' out_wav_path = r'./data/out/' _mix_start = 15.0 _mix_end = 22.0 angle_azimuth = 64.0 ################################################################# # 1.0 - Read signal x_all_arr, sr = read_mic_wav_from_path(in_wav_path, mic_count) (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) x_mix_arr = x_all_arr[:, (np.int32)(_mix_start * sr):(np.int32)(_mix_end * sr)] ################################################################# # 2 - Do STFT stft_mix = stft_arr(x_mix_arr, fftsize=n_fft, overlap=n_overlap) (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 - Plot DN angle_step = 1 print("Begin steering calc ...") arr_angle = range(-180, 180, angle_step) arr_d_arr = np.zeros((len(arr_angle), n_sensors, n_bins), dtype=np.complex) print('arr_d_arr = ', arr_d_arr.shape) for i, angle in enumerate(arr_angle): sensor_positions = get_sensor_positions_circular( r_circular_array, mic_count) source_position = get_source_position_circular(azimuth=angle, polar=90.0) arr_d_arr[i, :, :] = propagation_vector_free_field(sensor_positions, source_position, N_fft=n_fft, F_s=sr) print("Steering calc done!") ################################################################# # 4 - Calc map POW = np.zeros((len(arr_angle))) print("Begin calc map ...") for i, angle_h in enumerate(arr_angle): print(" process angle = {}".format(angle_h)) d_arr = arr_d_arr[i, :, :] # DS beamforming result_spec = ds_beamforming(stft_mix, d_arr.T) POW[i] = np.real( np.sum(result_spec * np.conjugate(result_spec)) / n_frames) print("Calc map done!") ################################################################# # 5 - Scale to power ch_0_0 P0 = np.sum(stft_mix[:, 0, :] * np.conjugate(stft_mix[:, 0, :])) / n_frames POW = POW / P0 ################################################################# # 6 - Plot DN plt.plot(arr_angle, POW) plt.xlabel('angle (s)') plt.ylabel('pow_res/pow_s0') plt.title('DS alg') plt.grid(True) plt.savefig(r".\out\DS_mic{}.png".format(mic_count)) plt.show() ################################################################# # 7 - Do DS beamforming print('Calc DS beamforming!') print(' (angle_azimuth) = ', angle_azimuth) sensor_positions = get_sensor_positions_circular(r_circular_array, mic_count) source_position = get_source_position_circular(azimuth=angle_azimuth, polar=90.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_mix, d_arr.T) ################################################################# # 5 inverse STFT and save sig_out = istft(result_spec.transpose((1, 0)), overlap=n_overlap) sf.write(r"out/out_DS_{}.wav".format(angle_azimuth), sig_out, sr)
def ds_respk(): # # ################################################################# # # 1.0 - simulation showroom, wgn WBN_16000hz # n_fft = 512 # n_overlap = 2 # # intermic_distance = 0.0457 # mic_count = 4 # in_wav_path = r'./data/_sim_shoroom/WBN_16000hz/4mic_output.wav' # out_wav_path = r'./data/out/' # _chirp_noise_start = 0 # _chirp_noise_end = 59 # _mix_start = 0 # _mix_end = 59 # angle_azimuth = 150.0 # ################################################################# # 1.0 - simulation showroom, wgn 2800_3800 n_fft = 512 n_overlap = 2 intermic_distance = 0.0457 mic_count = 4 #in_wav_path = r'./data/_sim_shoroom/WBN_2800_3800/4mic_output.wav' in_wav_path = r'./data/_sim_shoroom/WBN_2800_3800/4mic_output_reflection_0.wav' out_wav_path = r'./data/out/' _chirp_noise_start = 0 _chirp_noise_end = 59 _mix_start = 0 _mix_end = 59 angle_azimuth = 0.0 # # ################################################################# # # 1.0 - stc-h873 ex2 # n_fft = 512 # n_overlap = 2 # # intermic_distance = 0.05 # mic_count = 2 # in_wav_path = r'./data/_re_spk_ex2/stc-h873.wav' # out_wav_path = r'./data/out/' # _chirp_noise_start = 47 # _chirp_noise_end = 60 + 3 # _mix_start = 60 + 9 # _mix_end = 3*60 + 31 # angle_azimuth = 0.0 # # ################################################################# # # 1.0 - respeaker_mic_array ex2 # n_fft = 512 # n_overlap = 2 # # intermic_distance = 0.0457 # mic_count = 4 # in_wav_path = r'./data/_re_spk_ex2/respeaker_mic_array.wav' # out_wav_path = r'./data/out/' # _chirp_noise_start = 40 # _chirp_noise_end = 56 # _mix_start = 60 # _mix_end = 3*60 + 22 # angle_azimuth = -50.0 # # ################################################################# # # 1.0 - respeaker_core_v2 ex2 # n_fft = 512 # n_overlap = 2 # # intermic_distance = 0.0463 # mic_count = 6 # in_wav_path = r'./data/_re_spk_ex2/respeaker_core_v2.wav' # out_wav_path = r'./data/out/' # _chirp_noise_start = 52 # _chirp_noise_end = 69 # _mix_start = 70 # _mix_end = 3*60 + 35 # angle_azimuth = 30.0 # # ################################################################# # # 1.0 - respeaker_core_v2 ex1 # n_fft = 512 # n_overlap = 2 # # intermic_distance = 0.0463 # mic_count = 6 # in_wav_path = r'./data/_re_spk_ex1/respeaker_core_v2.wav' # out_wav_path = r'./data/out/' # _chirp_noise_start = 15 # _chirp_noise_end = 60 + 48 # _mix_start = 10 # _mix_end = 15 # angle_azimuth = 30.0 # # ################################################################# # # 1.0 - respeaker_mic_array ex1 # n_fft = 512 # n_overlap = 2 # # intermic_distance = 0.0457 # mic_count = 4 # in_wav_path = r'./data/_re_spk_ex2/respeaker_mic_array.wav' # out_wav_path = r'./data/out/' # _chirp_noise_start = 38 # _chirp_noise_end = 56 # _mix_start = 38 # _mix_end = 56 # angle_azimuth = -50.0 ################################################################# # 1.0 - Read signal x_all_arr, sr = read_mic_wav_from_file(in_wav_path, mic_count) (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) x_chirp_noise_arr = x_all_arr[:, (np.int32)(_chirp_noise_start * sr):(np.int32)(_chirp_noise_end * sr)] x_mix_arr = x_all_arr[:, (np.int32)(_mix_start * sr):(np.int32)(_mix_end * sr)] ################################################################# # 2 - Do STFT stft_mix = stft_arr(x_mix_arr, fftsize=n_fft, overlap=n_overlap) stft_chirp_noise_arr = stft_arr(x_chirp_noise_arr, fftsize=n_fft, overlap=n_overlap) (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 - Plot DN angle_step = 1 print("Begin steering calc ...") arr_angle = range(-180, 180, angle_step) arr_d_arr = np.zeros((len(arr_angle), n_sensors, n_bins), dtype=np.complex) print('arr_d_arr = ', arr_d_arr.shape) for i, angle in enumerate(arr_angle): sensor_positions = get_sensor_positions_respeaker( intermic_distance, mic_count) source_position = get_source_position_respeaker(azimuth=angle, polar=90) arr_d_arr[i, :, :] = propagation_vector_free_field(sensor_positions, source_position, N_fft=n_fft, F_s=sr) print("Steering calc done!") ################################################################# # 4 - Calc map POW = np.zeros((len(arr_angle))) print("Begin calc map ...") for i, angle_h in enumerate(arr_angle): print(" process angle = {}".format(angle_h)) d_arr = arr_d_arr[i, :, :] # DS beamforming result_spec = ds_beamforming(stft_chirp_noise_arr, d_arr.T) POW[i] = np.real( np.sum(result_spec * np.conjugate(result_spec)) / n_frames) print("Calc map done!") ################################################################# # 5 - Scale to power ch_0_0 P0 = np.sum(stft_chirp_noise_arr[:, 0, :] * np.conjugate(stft_chirp_noise_arr[:, 0, :])) / n_frames POW = POW / P0 ################################################################# # 6 - Plot DN plt.plot(arr_angle, POW) plt.xlabel('angle (s)') plt.ylabel('pow_res/pow_s0') plt.title('DS alg') plt.grid(True) plt.savefig(r".\out\DS_mic{}.png".format(mic_count)) plt.show() ################################################################# # 7 - Do DS beamforming print('Calc steering vector!') print(' (angle_azimuth) = ', angle_azimuth) sensor_positions = get_sensor_positions_respeaker(intermic_distance, mic_count) source_position = get_source_position_respeaker(azimuth=angle_azimuth, polar=90) 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_mix, d_arr.T) print('Calc RTF steering vector!') result_spec_rtf = rtf_filter(stft_mix, stft_chirp_noise_arr, 'simple') ################################################################# # 5 inverse STFT and save sig_out = istft(result_spec.transpose((1, 0)), overlap=n_overlap) sf.write(r"out/out_DS.wav", sig_out, sr) sig_out = istft(result_spec_rtf.transpose((1, 0)), overlap=n_overlap) sf.write(r"out/out_DS_rtf.wav", sig_out, sr)
################################################################# # 3 - Calc Chebyshev weights weights = get_chebyshev_weights_for_amplitudes(vert_mic_count, hor_mic_count, n_bins) # 4 - Calc steering vector with Chebyshev weights 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) d_arr_cheb = d_arr * weights ################################################################# # 4 - Calc DS filter output result_spec_cheb = ds_beamforming(stft_all, d_arr_cheb.T) np.save('Chebyshev', result_spec_cheb) ################################################################# # 5 inverse STFT and save sig_out = istft(result_spec_cheb.transpose((1, 0)), overlap=2) sf.write(r"out/out_rameses_cheb.wav", sig_out, sr)