Skip to content

Commit 954cd0a

Browse files
committed
add number of learning iteration option.
1 parent 82ef981 commit 954cd0a

File tree

6 files changed

+32
-12
lines changed

6 files changed

+32
-12
lines changed

include/srla.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#define SRLA_FORMAT_VERSION 9
88

99
/* コーデックバージョン */
10-
#define SRLA_CODEC_VERSION 16
10+
#define SRLA_CODEC_VERSION 17
1111

1212
/* ヘッダサイズ */
1313
#define SRLA_HEADER_SIZE 30

include/srla_encoder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct SRLAEncodeParameter {
1313
uint32_t max_num_samples_per_block; /* ブロックあたり最大サンプル数 */
1414
uint32_t num_lookahead_samples; /* 先読みサンプル数 */
1515
uint32_t ltp_order; /* LTP次数 */
16+
uint32_t num_svr_filter_learning_iteration; /* SVRフィルタ学習繰り返し回数 */
1617
uint8_t preset; /* エンコードパラメータプリセット */
1718
};
1819

libs/srla_encoder/src/srla_encoder.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ struct SRLAEncoder {
4242
uint32_t lb_num_samples_per_block; /* ブロックサンプル数の下限 */
4343
uint32_t max_num_parameters; /* 最大パラメータ数 */
4444
uint32_t ltp_order; /* LTP次数 */
45+
uint32_t num_svr_filter_learning_iteration; /* SVR学習繰り返し回数 */
4546
uint8_t set_parameter; /* パラメータセット済み? */
4647
struct LPCCalculator *lpcc; /* LPC計算ハンドル */
4748
struct SRLAPreemphasisFilter **pre_emphasis; /* プリエンファシスフィルタ */
@@ -745,6 +746,8 @@ SRLAApiResult SRLAEncoder_SetEncodeParameter(
745746
encoder->num_lookahead_samples = parameter->num_lookahead_samples;
746747
/* LTP次数設定 */
747748
encoder->ltp_order = parameter->ltp_order;
749+
/* SVR学習繰り返し回数設定 */
750+
encoder->num_svr_filter_learning_iteration = parameter->num_svr_filter_learning_iteration;
748751

749752
/* ヘッダ設定 */
750753
encoder->header = tmp_header;
@@ -1084,7 +1087,7 @@ static SRLAError SRLAEncoder_ComputeCoefficientsPerChannel(
10841087
/* SVRによるLPC係数計算 */
10851088
if ((ret = LPCCalculator_CalculateLPCCoefficientsSVR(encoder->lpcc,
10861089
buffer_double, num_samples,
1087-
double_coef, tmp_lpc_lpc_coef_order, parameter_preset->svr_max_num_iterations,
1090+
double_coef, tmp_lpc_lpc_coef_order, encoder->num_svr_filter_learning_iteration,
10881091
LPC_WINDOWTYPE_WELCH, SRLA_LPC_RIDGE_REGULARIZATION_PARAMETER,
10891092
parameter_preset->margin_list, parameter_preset->margin_list_size)) != LPC_APIRESULT_OK) {
10901093
return SRLA_ERROR_NG;

libs/srla_internal/include/srla_internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ struct SRLAParameterPreset {
9494
uint32_t max_num_parameters; /* 最大パラメータ数 */
9595
SRLAChannelProcessMethodTactics ch_process_method_tactics; /* マルチチャンネル処理の決定法 */
9696
SRLAChannelLPCOrderDecisionTactics lpc_order_tactics; /* LPCの次数決定法 */
97-
uint32_t svr_max_num_iterations; /* SVRの最大繰り返し回数 */
9897
const double *margin_list; /* マージンリスト */
9998
uint32_t margin_list_size; /* マージンリストサイズ */
10099
};

libs/srla_internal/src/srla_internal.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ static const double margin_list[] = { 0.0, 1.0 / 4096, 1.0 / 1024, 1.0 / 256, 1.
2828

2929
/* パラメータプリセット配列 */
3030
const struct SRLAParameterPreset g_srla_parameter_preset[] = {
31-
{ 0, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_MAX_FIXED, 0, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
32-
{ 8, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, 0, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
33-
{ 16, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, 0, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
34-
{ 32, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, 0, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
35-
{ 64, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, 0, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
36-
{ 128, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, 0, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
37-
{ 255, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, 0, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
31+
{ 0, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_MAX_FIXED, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
32+
{ 8, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
33+
{ 16, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
34+
{ 32, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
35+
{ 64, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
36+
{ 128, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
37+
{ 255, SRLA_CH_PROCESS_METHOD_TACTICS_ADAPTIVE, SRLA_LPC_ORDER_DECISION_TACTICS_BRUTEFORCE_ESTIMATION, SRLA_DEFINE_ARRAY_AND_NUM_ELEMTNS_TUPLE(margin_list) },
3838
};
3939
SRLA_STATIC_ASSERT(SRLA_NUM_ARRAY_ELEMENTS(g_srla_parameter_preset) == SRLA_NUM_PARAMETER_PRESETS);
4040

tools/srla_codec/srla_codec.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#define DEFALUT_LOOKAHEAD_SAMPLES_FACTOR 4
1717
/* デフォルトの可変ブロック分割数 */
1818
#define DEFALUT_NUM_VARIABLE_BLOCK_DIVISIONS 1
19+
/* デフォルトのSVRによるフィルタ同定の学習繰り返し回数 */
20+
#define DEFALUT_NUM_SVR_FILTER_LEARNING_ITERATIONS 0
1921
/* パラメータプリセットの最大インデックス */
2022
#define SRLA_MAX_PARAMETER_PRESETS_INDEX 6
2123
#if SRLA_MAX_PARAMETER_PRESETS_INDEX != (SRLA_NUM_PARAMETER_PRESETS - 1)
@@ -49,6 +51,8 @@ static struct CommandLineParserSpecification command_line_spec[] = {
4951
COMMAND_LINE_PARSER_TRUE, NULL, COMMAND_LINE_PARSER_FALSE },
5052
{ 'P', "long-term-prediction", "Specify long term (pitch) prediction order (must be odd number, default:0 (disabled))",
5153
COMMAND_LINE_PARSER_TRUE, NULL, COMMAND_LINE_PARSER_FALSE },
54+
{ 0, "svr-filter-learning-iteration", "Specify the number of itration in filter computation using SVR (default:" TOSTRING(DEFALUT_NUM_SVR_FILTER_LEARNING_ITERATIONS) ")",
55+
COMMAND_LINE_PARSER_TRUE, NULL, COMMAND_LINE_PARSER_FALSE },
5256
{ 0, "no-checksum-check", "Whether to NOT check checksum at decoding (default:no)",
5357
COMMAND_LINE_PARSER_FALSE, NULL, COMMAND_LINE_PARSER_FALSE },
5458
{ 'h', "help", "Show command help message",
@@ -69,7 +73,8 @@ static void encode_block_callback(
6973

7074
/* エンコード 成功時は0、失敗時は0以外を返す */
7175
static int do_encode(const char *in_filename, const char *out_filename,
72-
uint32_t encode_preset_no, uint32_t max_num_block_samples, uint32_t variable_block_num_divisions, uint32_t lookahead_samples_factor, uint32_t ltp_order)
76+
uint32_t encode_preset_no, uint32_t max_num_block_samples, uint32_t variable_block_num_divisions,
77+
uint32_t lookahead_samples_factor, uint32_t ltp_order, uint32_t num_svr_filter_learning_iteration)
7378
{
7479
FILE *out_fp;
7580
struct WAVFile *in_wav;
@@ -108,6 +113,7 @@ static int do_encode(const char *in_filename, const char *out_filename,
108113
parameter.min_num_samples_per_block = max_num_block_samples >> variable_block_num_divisions;
109114
parameter.max_num_samples_per_block = max_num_block_samples;
110115
parameter.num_lookahead_samples = lookahead_samples_factor * max_num_block_samples;
116+
parameter.num_svr_filter_learning_iteration = num_svr_filter_learning_iteration;
111117
parameter.ltp_order = ltp_order;
112118
/* プリセットの反映 */
113119
parameter.preset = (uint8_t)encode_preset_no;
@@ -307,6 +313,7 @@ int main(int argc, char** argv)
307313
uint32_t variable_block_num_divisions = DEFALUT_NUM_VARIABLE_BLOCK_DIVISIONS;
308314
uint32_t lookahead_samples_factor = DEFALUT_LOOKAHEAD_SAMPLES_FACTOR;
309315
uint32_t ltp_order = 0;
316+
uint32_t num_svr_filter_learning_iteration = DEFALUT_NUM_SVR_FILTER_LEARNING_ITERATIONS;
310317
/* エンコードプリセット番号取得 */
311318
if (CommandLineParser_GetOptionAcquired(command_line_spec, "mode") == COMMAND_LINE_PARSER_TRUE) {
312319
char *e;
@@ -381,9 +388,19 @@ int main(int argc, char** argv)
381388
return 1;
382389
}
383390
}
391+
if (CommandLineParser_GetOptionAcquired(command_line_spec, "svr-filter-learning-iteration") == COMMAND_LINE_PARSER_TRUE) {
392+
char *e;
393+
const char *lstr = CommandLineParser_GetArgumentString(command_line_spec, "svr-filter-learning-iteration");
394+
num_svr_filter_learning_iteration = (uint32_t)strtol(lstr, &e, 10);
395+
if (*e != '\0') {
396+
fprintf(stderr, "%s: invalid number of lookahead samples. (irregular character found in %s at %s)\n", argv[0], lstr, e);
397+
return 1;
398+
}
399+
}
384400
/* 一括エンコード実行 */
385401
if (do_encode(input_file, output_file,
386-
encode_preset_no, max_num_block_samples, variable_block_num_divisions, lookahead_samples_factor, ltp_order) != 0) {
402+
encode_preset_no, max_num_block_samples, variable_block_num_divisions,
403+
lookahead_samples_factor, ltp_order, num_svr_filter_learning_iteration) != 0) {
387404
fprintf(stderr, "%s: failed to encode %s. \n", argv[0], input_file);
388405
return 1;
389406
}

0 commit comments

Comments
 (0)