问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助 关于V17调制解调算法

发布网友 发布时间:2022-05-07 14:18

我来回答

2个回答

热心网友 时间:2023-11-04 22:11

spandsp是一个软件传真处理引擎,包含了从调制,发送,解调,编码各种功能。下面详细介绍spandsp的安装、使用方法。

安装spandsp需要预先安装libtiff和audiofile库(最新的spandsp已自带audiofile库),从http://www.libtiff.org/下载libtiff安装好后,再从http://www.soft-switch.org/downloads/spandsp/下载spandsp安装。安装过程都很简单:

./configure

make

sudo make install

spandsp支持v17,v21,v27,v29三种不同的调制功能,实现了T.30,T.4,HDLC协议。如果已从电话线中获取到了包含传真信息的音频文件,则可以用下面的程序进行解调,获得原始传真文件:

#define SAMPLES_PER_CHUNK 160

fsk_rx_state_t fsk;//v21解调器

v17_rx_state_t v17;//v17解调器

v29_rx_state_t v29;//v29解调器

v27ter_rx_state_t v27ter;//v27解调器

int16_t amp[SAMPLES_PER_CHUNK];

AFfilehandle inhandle;//音频文件句柄

int len;

const char *filename;

float x;

filename = "fax_samp.wav";//音频文件名

if (argc > 1)

filename = argv[1];

if ((inhandle = afOpenFile(filename, "r", NULL)) == AF_NULL_FILEHANDLE){//调用audiofile库函数打开音频文件

fprintf(stderr, " Cannot open wave file '%s'\n", filename);

exit(2);

}

if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) {

printf(" Unexpected frame size in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE){

printf(" Unexpected sample rate in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0){

printf(" Unexpected number of channels in speech file '%s' (%f)\n", filename, x);

exit(2);

}

memset(&t30_mmy, 0, sizeof(t30_mmy));

span_log_init(&t30_mmy.logging, SPAN_LOG_FLOW, NULL);//初始化日志对象

span_log_set_protocol(&t30_mmy.logging, "T.30");

hdlc_rx_init(&hdlcrx, FALSE, TRUE, 5, hdlc_accept, NULL);//初始化HDLC规程,注册hdlc_accept回调函数

fsk_rx_init(&fsk, &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, NULL);//初始化v21解调器,注册回调函数v21_put_bit

v17_rx_init(&v17, 14400, v17_put_bit, NULL);//初始化v17和回调函数

v29_rx_init(&v29, 9600, v29_put_bit, NULL);//初始化v29和回调函数

//v29_rx_init(&v29, 7200, v29_put_bit, NULL);

v27ter_rx_init(&v27ter, 4800, v27ter_put_bit, NULL);

//v27ter_rx_init(&v27ter, 2400, v27ter_put_bit, NULL);

fsk_rx_signal_cutoff(&fsk, -45.5);//配置参数

v17_rx_signal_cutoff(&v17, -45.5);

v29_rx_signal_cutoff(&v29, -45.5);

v27ter_rx_signal_cutoff(&v27ter, -40.0);

span_log_init(&v17.logging, SPAN_LOG_FLOW, NULL);//配置日志

span_log_set_protocol(&v17.logging, "V.17");

span_log_set_level(&v17.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v29.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v29.logging, "V.29");

span_log_set_level(&v29.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v27ter.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v27ter.logging, "V.27ter");

span_log_set_level(&v27ter.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

if (t4_rx_init(&t4_state, "fax_decode.tif", T4_COMPRESSION_ITU_T4_2D) == NULL) {//初始化t4

fprintf(stderr, "Failed to init\n");

exit(0);

}

for (;;)

{

len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK);//读取音频文件,解调

if(len<=0)

break;

fsk_rx(&fsk, amp, len);

//v17_rx(&v17, amp, len);

//v29_rx(&v29, amp, len);

v27ter_rx(&v27ter, amp, len);

}

if(t4_up) t4_end();//保存已解调的传真文件

t4_rx_end(&t4_state);

if (afCloseFile(inhandle) != 0){//关闭音频文件夹

fprintf(stderr, " Cannot close wave file '%s'\n", filename);

exit(2);

}

由以上代码可知,一个软件传真接收器必须包好v21解调器和hdlc规程,可选v17,v27,v29等不同速率的解调器。最后,一定要关闭传真文件,否则转化的传真图像可能未写到磁盘中。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foxwit/archive/2010/12/29/6106068.aspx

热心网友 时间:2023-11-04 22:11

书山有路勤为径

热心网友 时间:2023-11-04 22:11

spandsp是一个软件传真处理引擎,包含了从调制,发送,解调,编码各种功能。下面详细介绍spandsp的安装、使用方法。

安装spandsp需要预先安装libtiff和audiofile库(最新的spandsp已自带audiofile库),从http://www.libtiff.org/下载libtiff安装好后,再从http://www.soft-switch.org/downloads/spandsp/下载spandsp安装。安装过程都很简单:

./configure

make

sudo make install

spandsp支持v17,v21,v27,v29三种不同的调制功能,实现了T.30,T.4,HDLC协议。如果已从电话线中获取到了包含传真信息的音频文件,则可以用下面的程序进行解调,获得原始传真文件:

#define SAMPLES_PER_CHUNK 160

fsk_rx_state_t fsk;//v21解调器

v17_rx_state_t v17;//v17解调器

v29_rx_state_t v29;//v29解调器

v27ter_rx_state_t v27ter;//v27解调器

int16_t amp[SAMPLES_PER_CHUNK];

AFfilehandle inhandle;//音频文件句柄

int len;

const char *filename;

float x;

filename = "fax_samp.wav";//音频文件名

if (argc > 1)

filename = argv[1];

if ((inhandle = afOpenFile(filename, "r", NULL)) == AF_NULL_FILEHANDLE){//调用audiofile库函数打开音频文件

fprintf(stderr, " Cannot open wave file '%s'\n", filename);

exit(2);

}

if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) {

printf(" Unexpected frame size in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE){

printf(" Unexpected sample rate in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0){

printf(" Unexpected number of channels in speech file '%s' (%f)\n", filename, x);

exit(2);

}

memset(&t30_mmy, 0, sizeof(t30_mmy));

span_log_init(&t30_mmy.logging, SPAN_LOG_FLOW, NULL);//初始化日志对象

span_log_set_protocol(&t30_mmy.logging, "T.30");

hdlc_rx_init(&hdlcrx, FALSE, TRUE, 5, hdlc_accept, NULL);//初始化HDLC规程,注册hdlc_accept回调函数

fsk_rx_init(&fsk, &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, NULL);//初始化v21解调器,注册回调函数v21_put_bit

v17_rx_init(&v17, 14400, v17_put_bit, NULL);//初始化v17和回调函数

v29_rx_init(&v29, 9600, v29_put_bit, NULL);//初始化v29和回调函数

//v29_rx_init(&v29, 7200, v29_put_bit, NULL);

v27ter_rx_init(&v27ter, 4800, v27ter_put_bit, NULL);

//v27ter_rx_init(&v27ter, 2400, v27ter_put_bit, NULL);

fsk_rx_signal_cutoff(&fsk, -45.5);//配置参数

v17_rx_signal_cutoff(&v17, -45.5);

v29_rx_signal_cutoff(&v29, -45.5);

v27ter_rx_signal_cutoff(&v27ter, -40.0);

span_log_init(&v17.logging, SPAN_LOG_FLOW, NULL);//配置日志

span_log_set_protocol(&v17.logging, "V.17");

span_log_set_level(&v17.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v29.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v29.logging, "V.29");

span_log_set_level(&v29.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v27ter.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v27ter.logging, "V.27ter");

span_log_set_level(&v27ter.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

if (t4_rx_init(&t4_state, "fax_decode.tif", T4_COMPRESSION_ITU_T4_2D) == NULL) {//初始化t4

fprintf(stderr, "Failed to init\n");

exit(0);

}

for (;;)

{

len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK);//读取音频文件,解调

if(len<=0)

break;

fsk_rx(&fsk, amp, len);

//v17_rx(&v17, amp, len);

//v29_rx(&v29, amp, len);

v27ter_rx(&v27ter, amp, len);

}

if(t4_up) t4_end();//保存已解调的传真文件

t4_rx_end(&t4_state);

if (afCloseFile(inhandle) != 0){//关闭音频文件夹

fprintf(stderr, " Cannot close wave file '%s'\n", filename);

exit(2);

}

由以上代码可知,一个软件传真接收器必须包好v21解调器和hdlc规程,可选v17,v27,v29等不同速率的解调器。最后,一定要关闭传真文件,否则转化的传真图像可能未写到磁盘中。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foxwit/archive/2010/12/29/6106068.aspx

热心网友 时间:2023-11-04 22:11

书山有路勤为径

热心网友 时间:2023-11-04 22:11

spandsp是一个软件传真处理引擎,包含了从调制,发送,解调,编码各种功能。下面详细介绍spandsp的安装、使用方法。

安装spandsp需要预先安装libtiff和audiofile库(最新的spandsp已自带audiofile库),从http://www.libtiff.org/下载libtiff安装好后,再从http://www.soft-switch.org/downloads/spandsp/下载spandsp安装。安装过程都很简单:

./configure

make

sudo make install

spandsp支持v17,v21,v27,v29三种不同的调制功能,实现了T.30,T.4,HDLC协议。如果已从电话线中获取到了包含传真信息的音频文件,则可以用下面的程序进行解调,获得原始传真文件:

#define SAMPLES_PER_CHUNK 160

fsk_rx_state_t fsk;//v21解调器

v17_rx_state_t v17;//v17解调器

v29_rx_state_t v29;//v29解调器

v27ter_rx_state_t v27ter;//v27解调器

int16_t amp[SAMPLES_PER_CHUNK];

AFfilehandle inhandle;//音频文件句柄

int len;

const char *filename;

float x;

filename = "fax_samp.wav";//音频文件名

if (argc > 1)

filename = argv[1];

if ((inhandle = afOpenFile(filename, "r", NULL)) == AF_NULL_FILEHANDLE){//调用audiofile库函数打开音频文件

fprintf(stderr, " Cannot open wave file '%s'\n", filename);

exit(2);

}

if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) {

printf(" Unexpected frame size in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE){

printf(" Unexpected sample rate in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0){

printf(" Unexpected number of channels in speech file '%s' (%f)\n", filename, x);

exit(2);

}

memset(&t30_mmy, 0, sizeof(t30_mmy));

span_log_init(&t30_mmy.logging, SPAN_LOG_FLOW, NULL);//初始化日志对象

span_log_set_protocol(&t30_mmy.logging, "T.30");

hdlc_rx_init(&hdlcrx, FALSE, TRUE, 5, hdlc_accept, NULL);//初始化HDLC规程,注册hdlc_accept回调函数

fsk_rx_init(&fsk, &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, NULL);//初始化v21解调器,注册回调函数v21_put_bit

v17_rx_init(&v17, 14400, v17_put_bit, NULL);//初始化v17和回调函数

v29_rx_init(&v29, 9600, v29_put_bit, NULL);//初始化v29和回调函数

//v29_rx_init(&v29, 7200, v29_put_bit, NULL);

v27ter_rx_init(&v27ter, 4800, v27ter_put_bit, NULL);

//v27ter_rx_init(&v27ter, 2400, v27ter_put_bit, NULL);

fsk_rx_signal_cutoff(&fsk, -45.5);//配置参数

v17_rx_signal_cutoff(&v17, -45.5);

v29_rx_signal_cutoff(&v29, -45.5);

v27ter_rx_signal_cutoff(&v27ter, -40.0);

span_log_init(&v17.logging, SPAN_LOG_FLOW, NULL);//配置日志

span_log_set_protocol(&v17.logging, "V.17");

span_log_set_level(&v17.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v29.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v29.logging, "V.29");

span_log_set_level(&v29.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v27ter.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v27ter.logging, "V.27ter");

span_log_set_level(&v27ter.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

if (t4_rx_init(&t4_state, "fax_decode.tif", T4_COMPRESSION_ITU_T4_2D) == NULL) {//初始化t4

fprintf(stderr, "Failed to init\n");

exit(0);

}

for (;;)

{

len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK);//读取音频文件,解调

if(len<=0)

break;

fsk_rx(&fsk, amp, len);

//v17_rx(&v17, amp, len);

//v29_rx(&v29, amp, len);

v27ter_rx(&v27ter, amp, len);

}

if(t4_up) t4_end();//保存已解调的传真文件

t4_rx_end(&t4_state);

if (afCloseFile(inhandle) != 0){//关闭音频文件夹

fprintf(stderr, " Cannot close wave file '%s'\n", filename);

exit(2);

}

由以上代码可知,一个软件传真接收器必须包好v21解调器和hdlc规程,可选v17,v27,v29等不同速率的解调器。最后,一定要关闭传真文件,否则转化的传真图像可能未写到磁盘中。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foxwit/archive/2010/12/29/6106068.aspx

热心网友 时间:2023-11-04 22:11

书山有路勤为径

热心网友 时间:2023-11-04 22:11

spandsp是一个软件传真处理引擎,包含了从调制,发送,解调,编码各种功能。下面详细介绍spandsp的安装、使用方法。

安装spandsp需要预先安装libtiff和audiofile库(最新的spandsp已自带audiofile库),从http://www.libtiff.org/下载libtiff安装好后,再从http://www.soft-switch.org/downloads/spandsp/下载spandsp安装。安装过程都很简单:

./configure

make

sudo make install

spandsp支持v17,v21,v27,v29三种不同的调制功能,实现了T.30,T.4,HDLC协议。如果已从电话线中获取到了包含传真信息的音频文件,则可以用下面的程序进行解调,获得原始传真文件:

#define SAMPLES_PER_CHUNK 160

fsk_rx_state_t fsk;//v21解调器

v17_rx_state_t v17;//v17解调器

v29_rx_state_t v29;//v29解调器

v27ter_rx_state_t v27ter;//v27解调器

int16_t amp[SAMPLES_PER_CHUNK];

AFfilehandle inhandle;//音频文件句柄

int len;

const char *filename;

float x;

filename = "fax_samp.wav";//音频文件名

if (argc > 1)

filename = argv[1];

if ((inhandle = afOpenFile(filename, "r", NULL)) == AF_NULL_FILEHANDLE){//调用audiofile库函数打开音频文件

fprintf(stderr, " Cannot open wave file '%s'\n", filename);

exit(2);

}

if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) {

printf(" Unexpected frame size in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE){

printf(" Unexpected sample rate in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0){

printf(" Unexpected number of channels in speech file '%s' (%f)\n", filename, x);

exit(2);

}

memset(&t30_mmy, 0, sizeof(t30_mmy));

span_log_init(&t30_mmy.logging, SPAN_LOG_FLOW, NULL);//初始化日志对象

span_log_set_protocol(&t30_mmy.logging, "T.30");

hdlc_rx_init(&hdlcrx, FALSE, TRUE, 5, hdlc_accept, NULL);//初始化HDLC规程,注册hdlc_accept回调函数

fsk_rx_init(&fsk, &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, NULL);//初始化v21解调器,注册回调函数v21_put_bit

v17_rx_init(&v17, 14400, v17_put_bit, NULL);//初始化v17和回调函数

v29_rx_init(&v29, 9600, v29_put_bit, NULL);//初始化v29和回调函数

//v29_rx_init(&v29, 7200, v29_put_bit, NULL);

v27ter_rx_init(&v27ter, 4800, v27ter_put_bit, NULL);

//v27ter_rx_init(&v27ter, 2400, v27ter_put_bit, NULL);

fsk_rx_signal_cutoff(&fsk, -45.5);//配置参数

v17_rx_signal_cutoff(&v17, -45.5);

v29_rx_signal_cutoff(&v29, -45.5);

v27ter_rx_signal_cutoff(&v27ter, -40.0);

span_log_init(&v17.logging, SPAN_LOG_FLOW, NULL);//配置日志

span_log_set_protocol(&v17.logging, "V.17");

span_log_set_level(&v17.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v29.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v29.logging, "V.29");

span_log_set_level(&v29.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v27ter.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v27ter.logging, "V.27ter");

span_log_set_level(&v27ter.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

if (t4_rx_init(&t4_state, "fax_decode.tif", T4_COMPRESSION_ITU_T4_2D) == NULL) {//初始化t4

fprintf(stderr, "Failed to init\n");

exit(0);

}

for (;;)

{

len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK);//读取音频文件,解调

if(len<=0)

break;

fsk_rx(&fsk, amp, len);

//v17_rx(&v17, amp, len);

//v29_rx(&v29, amp, len);

v27ter_rx(&v27ter, amp, len);

}

if(t4_up) t4_end();//保存已解调的传真文件

t4_rx_end(&t4_state);

if (afCloseFile(inhandle) != 0){//关闭音频文件夹

fprintf(stderr, " Cannot close wave file '%s'\n", filename);

exit(2);

}

由以上代码可知,一个软件传真接收器必须包好v21解调器和hdlc规程,可选v17,v27,v29等不同速率的解调器。最后,一定要关闭传真文件,否则转化的传真图像可能未写到磁盘中。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foxwit/archive/2010/12/29/6106068.aspx

热心网友 时间:2023-11-04 22:11

书山有路勤为径

热心网友 时间:2023-11-04 22:11

spandsp是一个软件传真处理引擎,包含了从调制,发送,解调,编码各种功能。下面详细介绍spandsp的安装、使用方法。

安装spandsp需要预先安装libtiff和audiofile库(最新的spandsp已自带audiofile库),从http://www.libtiff.org/下载libtiff安装好后,再从http://www.soft-switch.org/downloads/spandsp/下载spandsp安装。安装过程都很简单:

./configure

make

sudo make install

spandsp支持v17,v21,v27,v29三种不同的调制功能,实现了T.30,T.4,HDLC协议。如果已从电话线中获取到了包含传真信息的音频文件,则可以用下面的程序进行解调,获得原始传真文件:

#define SAMPLES_PER_CHUNK 160

fsk_rx_state_t fsk;//v21解调器

v17_rx_state_t v17;//v17解调器

v29_rx_state_t v29;//v29解调器

v27ter_rx_state_t v27ter;//v27解调器

int16_t amp[SAMPLES_PER_CHUNK];

AFfilehandle inhandle;//音频文件句柄

int len;

const char *filename;

float x;

filename = "fax_samp.wav";//音频文件名

if (argc > 1)

filename = argv[1];

if ((inhandle = afOpenFile(filename, "r", NULL)) == AF_NULL_FILEHANDLE){//调用audiofile库函数打开音频文件

fprintf(stderr, " Cannot open wave file '%s'\n", filename);

exit(2);

}

if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) {

printf(" Unexpected frame size in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE){

printf(" Unexpected sample rate in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0){

printf(" Unexpected number of channels in speech file '%s' (%f)\n", filename, x);

exit(2);

}

memset(&t30_mmy, 0, sizeof(t30_mmy));

span_log_init(&t30_mmy.logging, SPAN_LOG_FLOW, NULL);//初始化日志对象

span_log_set_protocol(&t30_mmy.logging, "T.30");

hdlc_rx_init(&hdlcrx, FALSE, TRUE, 5, hdlc_accept, NULL);//初始化HDLC规程,注册hdlc_accept回调函数

fsk_rx_init(&fsk, &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, NULL);//初始化v21解调器,注册回调函数v21_put_bit

v17_rx_init(&v17, 14400, v17_put_bit, NULL);//初始化v17和回调函数

v29_rx_init(&v29, 9600, v29_put_bit, NULL);//初始化v29和回调函数

//v29_rx_init(&v29, 7200, v29_put_bit, NULL);

v27ter_rx_init(&v27ter, 4800, v27ter_put_bit, NULL);

//v27ter_rx_init(&v27ter, 2400, v27ter_put_bit, NULL);

fsk_rx_signal_cutoff(&fsk, -45.5);//配置参数

v17_rx_signal_cutoff(&v17, -45.5);

v29_rx_signal_cutoff(&v29, -45.5);

v27ter_rx_signal_cutoff(&v27ter, -40.0);

span_log_init(&v17.logging, SPAN_LOG_FLOW, NULL);//配置日志

span_log_set_protocol(&v17.logging, "V.17");

span_log_set_level(&v17.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v29.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v29.logging, "V.29");

span_log_set_level(&v29.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v27ter.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v27ter.logging, "V.27ter");

span_log_set_level(&v27ter.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

if (t4_rx_init(&t4_state, "fax_decode.tif", T4_COMPRESSION_ITU_T4_2D) == NULL) {//初始化t4

fprintf(stderr, "Failed to init\n");

exit(0);

}

for (;;)

{

len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK);//读取音频文件,解调

if(len<=0)

break;

fsk_rx(&fsk, amp, len);

//v17_rx(&v17, amp, len);

//v29_rx(&v29, amp, len);

v27ter_rx(&v27ter, amp, len);

}

if(t4_up) t4_end();//保存已解调的传真文件

t4_rx_end(&t4_state);

if (afCloseFile(inhandle) != 0){//关闭音频文件夹

fprintf(stderr, " Cannot close wave file '%s'\n", filename);

exit(2);

}

由以上代码可知,一个软件传真接收器必须包好v21解调器和hdlc规程,可选v17,v27,v29等不同速率的解调器。最后,一定要关闭传真文件,否则转化的传真图像可能未写到磁盘中。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foxwit/archive/2010/12/29/6106068.aspx

热心网友 时间:2023-11-04 22:11

书山有路勤为径

热心网友 时间:2023-11-04 22:11

spandsp是一个软件传真处理引擎,包含了从调制,发送,解调,编码各种功能。下面详细介绍spandsp的安装、使用方法。

安装spandsp需要预先安装libtiff和audiofile库(最新的spandsp已自带audiofile库),从http://www.libtiff.org/下载libtiff安装好后,再从http://www.soft-switch.org/downloads/spandsp/下载spandsp安装。安装过程都很简单:

./configure

make

sudo make install

spandsp支持v17,v21,v27,v29三种不同的调制功能,实现了T.30,T.4,HDLC协议。如果已从电话线中获取到了包含传真信息的音频文件,则可以用下面的程序进行解调,获得原始传真文件:

#define SAMPLES_PER_CHUNK 160

fsk_rx_state_t fsk;//v21解调器

v17_rx_state_t v17;//v17解调器

v29_rx_state_t v29;//v29解调器

v27ter_rx_state_t v27ter;//v27解调器

int16_t amp[SAMPLES_PER_CHUNK];

AFfilehandle inhandle;//音频文件句柄

int len;

const char *filename;

float x;

filename = "fax_samp.wav";//音频文件名

if (argc > 1)

filename = argv[1];

if ((inhandle = afOpenFile(filename, "r", NULL)) == AF_NULL_FILEHANDLE){//调用audiofile库函数打开音频文件

fprintf(stderr, " Cannot open wave file '%s'\n", filename);

exit(2);

}

if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) {

printf(" Unexpected frame size in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE){

printf(" Unexpected sample rate in speech file '%s' (%f)\n", filename, x);

exit(2);

}

if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0){

printf(" Unexpected number of channels in speech file '%s' (%f)\n", filename, x);

exit(2);

}

memset(&t30_mmy, 0, sizeof(t30_mmy));

span_log_init(&t30_mmy.logging, SPAN_LOG_FLOW, NULL);//初始化日志对象

span_log_set_protocol(&t30_mmy.logging, "T.30");

hdlc_rx_init(&hdlcrx, FALSE, TRUE, 5, hdlc_accept, NULL);//初始化HDLC规程,注册hdlc_accept回调函数

fsk_rx_init(&fsk, &preset_fsk_specs[FSK_V21CH2], TRUE, v21_put_bit, NULL);//初始化v21解调器,注册回调函数v21_put_bit

v17_rx_init(&v17, 14400, v17_put_bit, NULL);//初始化v17和回调函数

v29_rx_init(&v29, 9600, v29_put_bit, NULL);//初始化v29和回调函数

//v29_rx_init(&v29, 7200, v29_put_bit, NULL);

v27ter_rx_init(&v27ter, 4800, v27ter_put_bit, NULL);

//v27ter_rx_init(&v27ter, 2400, v27ter_put_bit, NULL);

fsk_rx_signal_cutoff(&fsk, -45.5);//配置参数

v17_rx_signal_cutoff(&v17, -45.5);

v29_rx_signal_cutoff(&v29, -45.5);

v27ter_rx_signal_cutoff(&v27ter, -40.0);

span_log_init(&v17.logging, SPAN_LOG_FLOW, NULL);//配置日志

span_log_set_protocol(&v17.logging, "V.17");

span_log_set_level(&v17.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v29.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v29.logging, "V.29");

span_log_set_level(&v29.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

span_log_init(&v27ter.logging, SPAN_LOG_FLOW, NULL);

span_log_set_protocol(&v27ter.logging, "V.27ter");

span_log_set_level(&v27ter.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_FLOW);

if (t4_rx_init(&t4_state, "fax_decode.tif", T4_COMPRESSION_ITU_T4_2D) == NULL) {//初始化t4

fprintf(stderr, "Failed to init\n");

exit(0);

}

for (;;)

{

len = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, SAMPLES_PER_CHUNK);//读取音频文件,解调

if(len<=0)

break;

fsk_rx(&fsk, amp, len);

//v17_rx(&v17, amp, len);

//v29_rx(&v29, amp, len);

v27ter_rx(&v27ter, amp, len);

}

if(t4_up) t4_end();//保存已解调的传真文件

t4_rx_end(&t4_state);

if (afCloseFile(inhandle) != 0){//关闭音频文件夹

fprintf(stderr, " Cannot close wave file '%s'\n", filename);

exit(2);

}

由以上代码可知,一个软件传真接收器必须包好v21解调器和hdlc规程,可选v17,v27,v29等不同速率的解调器。最后,一定要关闭传真文件,否则转化的传真图像可能未写到磁盘中。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foxwit/archive/2010/12/29/6106068.aspx

热心网友 时间:2023-11-04 22:11

书山有路勤为径
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 绝命时刻V17 setup_v17是什么? 手机相册里的照片找不到了怎么办 怎么拍出年轻时的照片 如何翻拍出年轻时的证件照呢,而且没有那时的证件照 只有生活照 怎样选择年轻时代的照片呢? 在什么人生资料上才能找到自己年轻时的照片? 照片找不到了怎么办? 相片里原先的相片找不到了怎么办? 没有小时候的照片,该怎么办? 小时候的照片没了,心里很难受,怎么办 一般十寸的喇叭是多少磁多少芯最为合理? 为什么当话筒接近扬声器时会有鸣叫? 求电脑入门的学习软件 笔记本电脑喇叭发出尖叫声? 音箱音响喇叭有蜂鸣一样的声音是怎么回事 极品赘婿更新到现在男主有几个女人? 英国首相布郎口语听起来很舒服,很清晰,请问他的是什么口音? 美国布郎大学和美国东北大学机算计专业谁更好? 在史努比花生大电影中,红发小女孩是不是天使的化身?查理布郎是不是很喜欢她? spa2000 v17 win10怎么安装 瑞星杀毒软件V17好用吗 瑞星杀毒软件v17使用评价怎么样 用瑞星V17杀毒软件全盘查杀出Trojan.Agent!8.B1E,给自动删除了。可是我看是url后缀的,会是误删吗? - 信息提示 中文是“换个说法”用英语怎么说 什么是给句子换个说法 换一种说法? 句子怎么换一种说法 换一种说法意思不变 我最近经常在黄页88网发信息,效果还不错,百度收录也很快。http:&#47;&#47;www.huangye88.com 给句子换个说法,意思不变? 如何提取http://www.br88.com/index.asp网页视频 请教换个说法是什么? 喇叭里面的铁柱是啥? 我输入百度 www.baidu.com 为什么转地址栏里是这样地址http:&#47;&#47;www1.baidu.com&#47;index.php?tn=index88_4_pg 换种说法 喇叭里用到了电磁铁原理吗? 喇叭里为什么要装一个磁铁。 换个说法,意思不变。