官方发布:G.722语音编解码标准详解

版权申诉
0 下载量 76 浏览量 更新于2024-10-10 2 收藏 1.8MB RAR 举报
资源摘要信息:"T-REC-G.722-201209-I!!PDF-E.rar_G.722_rec" G.722是一种广泛使用的数字音频编解码标准,由国际电信联盟-电信标准分局(ITU-T)制定。这种编解码标准特别适用于宽带音频的传输,能够在较窄的带宽内提供高质量的语音通信。G.722标准的全称是“7kHz音频编码在64 kbit/s单声道数字信道上的子带自适应差分脉冲编码调制(SB-ADPCM)”,它使用了子带编码技术,将音频信号分成不同的频率范围(子带),并对每个子带进行独立的ADPCM编码,最终将这些子带重新组合来重构音频信号。 G.722编解码器能以64 kbit/s的速率提供7 kHz的带宽,相较于传统的3.4 kHz带宽的电话通信系统,其提供了更加宽广的频率响应范围,能够覆盖人耳能够听到的大部分频率,从而大幅提升语音通信的质量。这种增强的音频带宽尤其适用于要求高保真音频通信的场合,如视频会议、电话会议、专业音频应用等。 G.722标准不仅能够在传统的固定电话网络中使用,也适用于基于IP的通信系统,比如VoIP(Voice over Internet Protocol)技术,使得高质量语音通信可以通过互联网实现。这项标准已经存在多年,并在多种通信设备中得到广泛应用。 G.722的压缩率相对较低,这意味着它并没有过度压缩音频信号,因此在保持了高质量音频的同时,也牺牲了一些数据传输效率。然而,随着通信技术的发展和网络带宽的增加,这个问题已经变得不那么明显,使得G.722成为一个非常实用和流行的选择。 国际电信联盟发布的G.722标准文档详细介绍了该编解码技术的原理、实现方法以及性能参数。文档中包含的技术细节对于设计和实现G.722编解码器的工程师来说至关重要,因为这些细节可以帮助他们确保编解码器的性能满足ITU-T制定的标准。此外,了解这些文档也有助于在系统集成、测试和维护中遇到相关问题时能够更加高效地进行故障排查和性能优化。 国际电信联盟(ITU)是一个联合国的专门机构,负责制定国际电信标准,以促进全球范围内的通信网络和设备的互操作性。ITU-T是其下的一个部门,专注于电信标准的制定,涵盖从传统电话网络到现代互联网通信的各个方面。G.722标准作为ITU-T众多标准之一,是全球通信领域广泛认同和遵循的标准之一。 在文件名称列表中,“T-REC-G.722-201209-I!!PDF-E.pdf”表明该文档是一个PDF格式的文件,文件名中包含了发布的时间信息“201209”(即2012年9月),这表示文档是在这个时间点发布的最新版本。文件名中的“!!PDF-E”表示文件是用英文书写的,其中的“-E”通常用于标识文件的语言版本。由于该文件是官方说明文档,因此可以预见该文档将包含G.722标准的完整技术说明,适用规范以及可能包含的任何更新或修正。 在实际应用中,了解G.722标准对开发高质量通信系统至关重要,尤其是对于那些希望提供高清晰度音频服务的开发者和公司。这项标准不仅确保了不同通信系统间的兼容性和互操作性,还为用户提供了一致和预期的音频体验。因此,无论是制造商、服务提供商还是最终用户,都有必要了解和掌握G.722标准的相关知识,以充分利用其带来的优势。

帮我把下面一段C++代码改写成python代码:#include "Trade.h" #include "WPrice.h" #include <algorithm> double normalCDF(double x) // Phi(-∞, x) aka N(x) { return std::erfc(-x / std::sqrt(2)) / 2; //erfc()是互补误差函数,该返回值表示标准正态分布下var小于x的概率,即N(x) } CTrade::CTrade(double tick) : wp_bid(0.01), wp_ask(0.01), m_tick(tick), m_TimeRound(50) { newday(NULL); } CTrade::~CTrade() { } void CTrade::OnBook(const BTRec& btRec) { wp.setGamma(0.1); wp_bid = wp.getWP(&btRec.Bids); wp_ask = wp.getWP(&btRec.Asks); if (wp_mid > 0){ //wp_mid初始化为-1,仅遇到第一条BTRec记录时条件为false double wp_now = (wp_bid + wp_ask) / 2; //updated wp_mid int volume = btRec.volume; //volume between two orderbook records double ratio = normalCDF((wp_now - wp_mid) / (2 * m_tick)); //m_tick = tick = 0.2 double buyvolume = ratio*volume, sellvolume = (1 - ratio)*volume; m_TimeRound.update(buyvolume, sellvolume, btRec.rec_time.timestamp); //volume moving average if (mv_volume < 0) { mv_volume = volume; mv_buyvolume = buyvolume; } else{ mv_volume += 0.002*(volume - mv_volume); mv_buyvolume += 0.002*(buyvolume - mv_buyvolume); } // round trip volatility if (time_ini < 0 || btRec.rec_time.timestamp - time_ini >= time_scale){ if (time_ini>0){ double dp = wp_now - wp_ini; volatility += 0.05*(dp*dp - volatility); } time_scale = m_TimeRound.getTime() * 1000; //in milliseconds time_ini = btRec.rec_time.timestamp; wp_ini = wp_now; } } wp_mid = (wp_bid + wp_ask) / 2; } void CTrade::newday(const char* p) { wp_mid = -1; m_TimeRound.newday(p); volatility = 16 * m_tick*m_tick; time_slapse = -1, time_scale = -1, wp_ini = -1, time_ini = -1; mv_buyvolume = mv_volume = -1; }

2023-05-15 上传

解释下Peoplesoft的这段代码 Component array of array of any &tmpArray; Local Record &rec1, &rec2; &rec1 = CreateRecord(Record.HIK_IPSANRS_TBL); &rec2 = CreateRecord(Record.HIK_IPSAN_TBL); Local Rowset &rsLvl1, &rsDtl; Local number &i, &j; Local Row &row; &rsLvl1 = GetLevel0()(1).GetRowset(Scroll.WPS_STR_INF_TBL); For &i = 1 To &rsLvl1.ActiveRowCount &rsDtl = &rsLvl1(&i).GetRowset(Scroll.WPS_STR_DTL_TBL); For &j = 1 To &rsDtl.ActiveRowCount &row = &rsDtl(&j); If Not &row.IsDeleted Then If All(&row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value) Then &rec1 = CreateRecord(Record.WPS_IPSANRS_TBL); &rec1.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec1.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; If &rec1.SelectByKey() Then &rec1.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec1.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; &rec1.STATUS.Value = &rsLvl1(&i).WPS_STR_INF_TBL.STATUS.Value; &rec1.Update(); Else &rec1.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec1.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; &rec1.STATUS.Value = "A"; &rec1.Insert(); End-If; &rec2 = CreateRecord(Record.WPS_IPSAN_TBL); &rec2.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec2.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; &rec2.WPS_STORID.Value = &row.WPS_STR_DTL_TBL.WPS_STORID.Value; &rec2.WPS_GP_WAGECODE.Value = &row.WPS_STR_DTL_TBL.WPS_GP_WAGECODE.Value; If Not &rec2.Insert() Then &rec2.Update(); End-If; End-If; End-If; End-For; End-For;

2023-06-13 上传