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 ---