40
raw_data_block (). Псевдокод, показанный ниже, описывает:
- как определить число окон в window_sequence num_windows;
- как определить число window_groups num_window_groups;
- как определить число окон в каждой группе window_group_length [g];
- как определить общее количество оконных полос масштабных коэффициентов num_swb для фактического типа окна;
- как определить swb_offset[swb], смещение первого коэффициента в оконной полосе масштабных коэффициентов swb используемого окна;
- как определить sect_sfb_offset[g][section], смещение первого коэффициента в разделе section.
Это смещение зависит от window_sequence и scale_factor_grouping и требуется, чтобы декодировать
spectraldata ().
Длинное окно преобразования всегда описывается как window_group, содержащая единственное окно. Так как число полос масштабных коэффициентов и их ширина зависят от частоты дискретизации, зависимые переменные индексируются с sampling_frequency_index для выбора соответствующей таблицы.
fsindex =
sampling_frequency_index;
switch (window_sequence) { case
ONLY_LONG_SEQUENCE:
case
LONG_START_SEQUENCE:
case LONG_STOP_SEQUENCE: num_windows = 1; num_window_groups = 1; window_group_length [num_window_groups-1 ] = 1; num_swb = num_swb_long_window[fs_index];
/* preparation of sect_sfb_offset for long blocks */
/* also copy the last value! */ for (i = 0; i < maxsfb + 1; i++) {
sect_sfb_offset[0][i] = swb_offset_long_window[fs_index][i];
swb_offset[i] = swb_offset_long_window[fs_index][i];
}
break;
case
IGHT_SHORT_SEQUENCE: num_windows = 8; num_window_groups = 1;
window_group_length [num_window_groups-1] = 1;
num_swb = num_swb_short_window[fs_index];
for (i = 0; i < num_swb_short_window[fs_index] + 1;
i++)
swb_offset[i] = swb_offset_short_window[fs_index][i]; for (i = 0; i < num_windows-1; i + +) {
if (bit_set (scale_factor_grouping,6-i)) == 0) {
num_window_groups += 1; window_group_length [num_window_groups-1] = 1;
} else
{
window_group_length [num_window_groups-1] += 1;}
/* preparation of sect_sfb_offset for short blocks */ for (g = 0; g < num_window_groups; g+ +) {
sect_sfb = 0; offset = 0;
for (i = 0; i < max_sfb; i++) {
width = swb_offset_short_window[fs_index][i+1] - swb_offset_short_window[fs_index] [i]; width *= window_group_length [g]; sect_sfb_offset[g][sect_sfb++] = offset; offset += width;
}
sect_sfb_offset[g][sect_sfb] = offset;
}
b
reak;
d
efault:
b
reak;