Skip to content

Instantly share code, notes, and snippets.

@rniwase
Created June 1, 2020 07:09
Show Gist options
  • Save rniwase/f5153bc7772cce98716ce86c8e0bf33b to your computer and use it in GitHub Desktop.
Save rniwase/f5153bc7772cce98716ce86c8e0bf33b to your computer and use it in GitHub Desktop.
CDイメージからPCMを抽出してMS分離の有無でADPCMを適用したときの歪みを比較する
import numpy as np
from scipy import signal
from scipy import fftpack
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import soundfile as sf
import audioop
samplerate = 44100
fft_size = 8192
start_time = [15, 30, 7] # [min, sec, 0.01sec]
stop_time = [18, 54, 67]
start_sec = (start_time[0] * 60) + start_time[1] + (start_time[2] * 0.01)
stop_sec = (stop_time[0] * 60) + stop_time[1] + (stop_time[2] * 0.01)
start_sample = int(start_sec * samplerate)
stop_sample = int(stop_sec * samplerate)
num_sample = stop_sample - start_sample
num_seek = start_sample * 2 * 2 # 16bit, 2ch
time_min = np.linspace(0., (stop_sec-start_sec)/60, num_sample, endpoint=False)
file = open("Image.bin", mode="rb")
file.seek(num_seek)
data = np.fromfile(file, "<i2", num_sample * 2) # 16bit, 2ch
data = data.reshape((-1,2))
data_L = data[:,0].astype(np.int32)
data_R = data[:,1].astype(np.int32)
del(data)
data_mid = ((data_L + data_R) / 2).astype(np.int32)
data_side = ((data_L - data_R) / 2).astype(np.int32)
def adopt_codec(data):
inpcm = data.astype(np.int16).tobytes()
adpcm_frag, _ = audioop.lin2adpcm(inpcm, 2, None)
outpcm, _ = audioop.adpcm2lin(adpcm_frag, 2, None)
return np.frombuffer(outpcm, dtype=np.int16)
data_L_cod = adopt_codec(data_L)[:num_sample-4]
data_R_cod = adopt_codec(data_R)[:num_sample-4]
data_mid_cod = adopt_codec(data_mid)[:num_sample-4]
data_side_cod = adopt_codec(data_side)[:num_sample-4]
data_L_frm_ms = (data_mid_cod + data_side_cod).astype(np.int16)
data_R_frm_ms = (data_mid_cod - data_side_cod).astype(np.int16)
dist_LR = np.sum(np.power(np.concatenate([data_L_cod, data_R_cod]) - np.concatenate([data_L[:num_sample-4], data_R[:num_sample-4]]), 2)) / num_sample
dist_msLR = np.sum(np.power(np.concatenate([data_L_frm_ms, data_R_frm_ms]) - np.concatenate([data_L[:num_sample-4], data_R[:num_sample-4]]), 2)) / num_sample
print('LR_distortion: {}'.format(dist_LR))
print('MS_distortion: {}'.format(dist_msLR))
sf.write("outdata_LR.wav", np.array([data_L_cod, data_R_cod]).T.astype(np.int16), samplerate)
sf.write("outdata_MS.wav", np.array([data_L_frm_ms, data_R_frm_ms]).T.astype(np.int16), samplerate)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment