sbc_encoder.py (af086c983e7678aa1bcc82a85ea58f14716edbed) | sbc_encoder.py (1522543de84c04e141f181431af0e80f00b6b718) |
---|---|
1#!/usr/bin/env python 2import numpy as np 3import wave 4import struct 5import sys 6from sbc import * 7 8X = np.zeros(80, dtype = np.int16) 9 10 11def fetch_samples_for_next_sbc_frame(fin, frame): | 1#!/usr/bin/env python 2import numpy as np 3import wave 4import struct 5import sys 6from sbc import * 7 8X = np.zeros(80, dtype = np.int16) 9 10 11def fetch_samples_for_next_sbc_frame(fin, frame): |
12 nr_audio_frames = frame.nr_blocks * frame.nr_subbands 13 raw_data = fin.readframes(nr_audio_frames) # Returns byte data 14 15 total_samples = nr_audio_frames * frame.nr_channels | 12 nr_samples = frame.nr_blocks * frame.nr_subbands * frame.nr_channels 13 raw_data = fin.readframes(nr_samples) # Returns byte data |
16 len_raw_data = len(raw_data) / 2 | 14 len_raw_data = len(raw_data) / 2 |
17 18 padding = np.zeros(total_samples - len_raw_data, dtype=np.int16) 19 | 15 |
20 fmt = "%ih" % len_raw_data # read signed 2 byte shorts 21 | 16 fmt = "%ih" % len_raw_data # read signed 2 byte shorts 17 |
22 frame.pcm = np.concatenate([np.array(struct.unpack(fmt, raw_data)), padding]) 23 del raw_data | 18 data = struct.unpack(fmt, raw_data) 19 len_data = len(data) |
24 | 20 |
21 for i in range(frame.nr_blocks * frame.nr_subbands): 22 for ch in range(frame.nr_channels): 23 index = i*2 + ch 24 if index < len_data: 25 frame.pcm[ch][i] = data[i*2 + ch] 26 else: 27 frame.pcm[ch][i] = 0 28 |
|
25 26def sbc_frame_analysis(frame, ch, blk, C): 27 global X 28 29 M = frame.nr_subbands 30 L = 10 * M 31 M2 = 2*M 32 L2 = 2*L --- 31 unchanged lines hidden (view full) --- 64 else: 65 return -1 66 67 frame.sb_sample = np.ndarray(shape=(frame.nr_blocks, frame.nr_channels, frame.nr_subbands)) 68 index = 0 69 for ch in range(frame.nr_channels): 70 for blk in range(frame.nr_blocks): 71 for sb in range(frame.nr_subbands): | 29 30def sbc_frame_analysis(frame, ch, blk, C): 31 global X 32 33 M = frame.nr_subbands 34 L = 10 * M 35 M2 = 2*M 36 L2 = 2*L --- 31 unchanged lines hidden (view full) --- 68 else: 69 return -1 70 71 frame.sb_sample = np.ndarray(shape=(frame.nr_blocks, frame.nr_channels, frame.nr_subbands)) 72 index = 0 73 for ch in range(frame.nr_channels): 74 for blk in range(frame.nr_blocks): 75 for sb in range(frame.nr_subbands): |
72 frame.EX[sb] = np.int16(frame.pcm[index]) | 76 frame.EX[sb] = np.int16(frame.pcm[ch][index]) |
73 index+=1 74 sbc_frame_analysis(frame, ch, blk, C) 75 return 0 76 77def sbc_encode(frame): 78 err = sbc_analysis(frame) 79 if err >= 0: 80 err = sbc_quantization(frame) --- 24 unchanged lines hidden (view full) --- 105 frame.scale_factor[0][sb] = scale_factor[0][sb] 106 frame.scale_factor[1][sb] = scale_factor[1][sb] 107 frame.scalefactor[0][sb] = scalefactor[0][sb] 108 frame.scalefactor[1][sb] = scalefactor[1][sb] 109 for blk in range(frame.nr_blocks): 110 frame.sb_sample[blk][0][sb] = sb_sample[blk][0][sb] 111 frame.sb_sample[blk][1][sb] = sb_sample[blk][1][sb] 112 | 77 index+=1 78 sbc_frame_analysis(frame, ch, blk, C) 79 return 0 80 81def sbc_encode(frame): 82 err = sbc_analysis(frame) 83 if err >= 0: 84 err = sbc_quantization(frame) --- 24 unchanged lines hidden (view full) --- 109 frame.scale_factor[0][sb] = scale_factor[0][sb] 110 frame.scale_factor[1][sb] = scale_factor[1][sb] 111 frame.scalefactor[0][sb] = scalefactor[0][sb] 112 frame.scalefactor[1][sb] = scalefactor[1][sb] 113 for blk in range(frame.nr_blocks): 114 frame.sb_sample[blk][0][sb] = sb_sample[blk][0][sb] 115 frame.sb_sample[blk][1][sb] = sb_sample[blk][1][sb] 116 |
113def calculate_scalefactor(max_subbandsample): 114 x = 0 115 while True: 116 y = 1 << x + 1 117 if y > max_subbandsample: 118 break 119 x += 1 120 return (x,y) | |
121 | 117 |
122 | |
123def sbc_quantization(frame): | 118def sbc_quantization(frame): |
124 max_subbandsample = np.zeros(shape = (frame.nr_channels, frame.nr_subbands)) 125 126 for blk in range(frame.nr_blocks): 127 for ch in range(frame.nr_channels): 128 for sb in range(frame.nr_subbands): 129 m = abs(frame.sb_sample[blk][ch][sb]) 130 if max_subbandsample[ch][sb] < m: 131 max_subbandsample[ch][sb] = m 132 133 134 for ch in range(frame.nr_channels): 135 for sb in range(frame.nr_subbands): 136 frame.scale_factor[ch][sb] = 0 137 frame.scalefactor[ch][sb] = 2 138 for blk in range(frame.nr_blocks): 139 while frame.scalefactor[ch][sb] < abs(frame.sb_sample[blk][ch][sb]): 140 frame.scale_factor[ch][sb]+=1 141 frame.scalefactor[ch][sb] *= 2 142 143 #(frame.scale_factor[ch][sb], frame.scalefactor[ch][sb]) = calculate_scalefactor(max_subbandsample[ch][sb]) 144 | 119 calculate_scalefactors_and_channel_mode(frame) |
145 frame.bits = sbc_bit_allocation(frame) 146 147 # Reconstruct the Audio Samples 148 frame.levels = np.zeros(shape=(frame.nr_channels, frame.nr_subbands), dtype = np.int32) 149 for ch in range(frame.nr_channels): 150 for sb in range(frame.nr_subbands): 151 frame.levels[ch][sb] = (1 << frame.bits[ch][sb]) - 1 #pow(2.0, frame.bits[ch][sb]) - 1 152 153 frame.syncword = 156 154 frame.crc_check = calculate_crc(frame) 155 156 frame.join = np.zeros(frame.nr_subbands, dtype = np.uint8) | 120 frame.bits = sbc_bit_allocation(frame) 121 122 # Reconstruct the Audio Samples 123 frame.levels = np.zeros(shape=(frame.nr_channels, frame.nr_subbands), dtype = np.int32) 124 for ch in range(frame.nr_channels): 125 for sb in range(frame.nr_subbands): 126 frame.levels[ch][sb] = (1 << frame.bits[ch][sb]) - 1 #pow(2.0, frame.bits[ch][sb]) - 1 127 128 frame.syncword = 156 129 frame.crc_check = calculate_crc(frame) 130 131 frame.join = np.zeros(frame.nr_subbands, dtype = np.uint8) |
132 133 |
|
157 if frame.channel_mode == JOINT_STEREO: 158 calculate_joint_stereo_signal(frame) 159 160 for blk in range(frame.nr_blocks): 161 for ch in range(frame.nr_channels): 162 for sb in range(frame.nr_subbands): 163 if frame.levels[ch][sb] > 0: 164 SB = frame.sb_sample[blk][ch][sb] --- 72 unchanged lines hidden --- | 134 if frame.channel_mode == JOINT_STEREO: 135 calculate_joint_stereo_signal(frame) 136 137 for blk in range(frame.nr_blocks): 138 for ch in range(frame.nr_channels): 139 for sb in range(frame.nr_subbands): 140 if frame.levels[ch][sb] > 0: 141 SB = frame.sb_sample[blk][ch][sb] --- 72 unchanged lines hidden --- |