fm应用详细设计说明书
fm应用
详细设计说明书
珠海市杰理科技股份有限公司
Zhuhai Jieli Technologyco.,LTD
版权所有,未经许可,禁止外传
版权所有,侵权必究 1
地址:珠海市吉大石花西路 107号9栋综合楼 邮编:519015
电话:0756-6313088 传真:0756-6313081
网站:www.zh-jieli.com
修改记录
| 版本 | 更新日期 | 描述 |
|---|---|---|
| V1.0 | ||
| V1.1 |
版权所有,侵权必究 2
目录
1.引 言..............................................................................................................................................................................4
- 1.编写目的............................................................................................................................................................. 4
1.2.参考资料............................................................................................................................................................. 4
1.3.术语和缩写词..................................................................................................................................................... 4
2.总体设计........................................................................................................................................................................4 - 1.需求概述............................................................................................................................................................. 4
2.2.总体架构设计..................................................................................................................................................... 4
(a)总体架构图................................................................................................................................................. 5
2.3.应用的生命周期................................................................................................................................................. 5
(a)应用的启动................................................................................................................................................. 6
(b)应用的退出................................................................................................................................................. 6
2.4.关键数据结构、变量说明.................................................................................................................................. 6
(a)fm api数据结构...........................................................................................................................................6
(b) Fm vm数据结构......................................................................................................................................... 7
3.应用逻辑处理模块设计说明......................................................................................................................................... 7
3.1.模块描述........................................................................................................................................................... 7
3.2.模块功能............................................................................................................................................................. 8
3.3.模块接口设计..................................................................................................................................................... 8 - Fm api模块设计说明.................................................................................................................................................. 10
- 1.模块描述........................................................................................................................................................... 10
4.2.模块接口设计................................................................................................................................................... 10 - Fm vm模块设计说明.................................................................................................................................................. 12
- 1.模块描述........................................................................................................................................................... 12
5.2.模块接口设计................................................................................................................................................... 12 - Fm调试说明................................................................................................................................................................ 15
- 1.基本配置........................................................................................................................................................... 15
6.2.模块扩展........................................................................................................................................................... 16
6.3.内置FM说明................................................................................................................................................... 16
6.4.内置FM快速调试............................................................................................................................................ 18
6.5.内置FM硬件................................................................................................................................................... 18
6.6.内置FM参数介绍............................................................................................................................................ 19
6.7.搜台参数设定................................................................................................................................................... 19
6.8.内置FM常用接口............................................................................................................................................22
版权所有,侵权必究 3
1. 引 言
1.1.编写目的
该文档为基于杰理BR系列蓝牙音箱平台开发fm应用的人员提供相应的设计开发文档。也可以为测试fm应用的测试人员提供参考。
文档中详细定义了fm应用的总体功能、系统的接口和数据属性;
1.2.参考资料
[ 1]
1.3.术语和缩写词
| 缩写和术语 | 解 释 |
|---|---|
| fm | FM调频即收音机功能 |
| Fm 频点 | 频点,指具体的绝对频率值 |
| Fm 频道 | 具有有效信息的频点 |
| Fm 虚拟频点 | 使用了数字序号 1、 2、 3代替了8750、 8760、 8770等真实的频率 |
2.总体设计
2.1.需求概述
本应用实现的功能包括内部收音模块驱动和linein采集外部收音实现fm功能的播放。
2.2.总体架构设计
版权所有,侵权必究 4
地址:珠海市吉大石花西路 107号9栋综合楼 邮编:519015
电话:0756-6313088 传真:0756-6313081
网站:www.zh-jieli.com
(a)总体架构图
上图体现了各个功能模块之间的调用关系。进入fm模式首先会对时钟和ui进行初始化,获取fm 的 vm保存信息,根据vm信息设置好播放发频点或者频道,然后播放fm模式的提示音,接着就是开启fm播放。
本应用的程序组织基本上是以界面来划分,加上一些附加子功能模块,每个模块都有清晰的接口,分别完成独立的功能,模块之间通过有机的结合组成一个功能强大的音乐播放器。本应用可以分为4个功能模块,具体划分详见下表。
| 模块名称 | 功能简述 | 对应文件 |
|---|---|---|
| 应用逻辑处理模块 | 应用初始化,参数恢复,备份,资源开关 | fm.c |
| 应用实现api模块 | 播放函数、 暂停函数开启fm 的实现 | fm_api.c |
| 应用vm存储模式 | Fm频点信息的保存接口 | fm_rw.c |
| 应用显示实现 | fm模式显示实现 | ui fm.c |
2.3.应用的生命周期
fm应用在fmtask调用执行时生命周期开始,当fmtask应用被执行时,当从按键切换了其他的应用模版权所有,侵权必究 5
式、关机、插入usb、 退出fm应用,应用生命周期结束。
(a)应用的启动
fm应用由app_fm_task启动,随即调用fm_app_init 进行了初始化,初始化主要工作为:设置ui界面为fm主页、设置fm空闲时钟、开启按键使能、初始化fm。 如图:
(b)应用的退出
当按键切换了模式,应用执行退出处理流程,应用退出是关闭显示主页、关闭fm模块、关闭模式提示音等。如图:
2.4.关键数据结构、变量说明
(a) fm api数据结构
Api 中使用该数据结构进行信息存储:
struct fm_opr {
void *dev;//未使用
u8 volume: 7;//音量
u8 fm_dev_mute : 1;//mute状态
u8 scan_flag;//搜索标志位,客户增加了自己了搜索标志位也要对应增加
u16 fm_freq_cur; // 这是虚拟频率,从1计算 real_freq = fm_freq_cur + 874
版权所有,侵权必究 6
u16 fm_freq_channel_cur;//当前的台号,从1计算
u16 fm_total_channel;//总共台数
s16 scan_fre;//搜索过程的虚拟频率,因为--会少于0,使用带符号};
#define SCANE_ALL (0x01)//全自动搜台标志
#define SEMI_SCANE_DOWN (0x02)//半自动搜索标志位
#define SEMI_SCANE_UP (0x03)//半自动搜台标志
(b) Fm vm数据结构
typedef struct FM_INFO {
u16 mask;//mask标志
u16 curFreq;//最近浏览的虚拟频点
u16 curChanel;//最近浏览的频道
u16 total_chanel;//搜索到频道数
u8 dat[MEM_FM_LEN];//频道映射表} FM_INFO;
#define FREQ_STEP (100)//100 步进
#define REAL_FREQ_MIN (8750)//真实频点开始
#define REAL_FREQ_MAX (10800)//真实频点结束
#define VIRTUAL_FREQ_STEP (FREQ_STEP/10)//虚拟频点步进
#define REAL_FREQ(x) ((REAL_FREQ_MIN-VIRTUAL_FREQ_STEP)+(x)*VIRTUAL_FREQ_STEP)
//虚拟频点转真实频点
#define VIRTUAL_FREQ(x) ((x-(REAL_FREQ_MIN-VIRTUAL_FREQ_STEP))/VIRTUAL_FREQ_STEP)
//真实频点转虚拟频点
#define MAX_CHANNEL ((REAL_FREQ_MAX-REAL_FREQ_MIN)/VIRTUAL_FREQ_STEP + 1)//最大频道数
3.应用逻辑处理模块设计说明
3.1.模块描述
本模块为fm应用的入口与出口,是顺序处理的模块, 占用app_core 任务。
版权所有,侵权必究 7
3.2.模块功能
本模块对应的文件是fm.c,进入时负责系统的初始化,资源的打开,数据的恢复,在初始化完成后就自动进入播放状态,退出时负责数据的保存及资源的关闭。
3.3.模块接口设计
app_fm_task
● 功能描述:
fm模式的主任务
● 函数原形:
void app_fm_task()
● 输入参数描述无
● 输出参数描述:
无
fm_app_init
● 功能描述:
fm模式初始化入口
● 函数原形:
● static void fm_app_init(void)
● 输入参数描述无
● 输出参数描述:
无
fm_app_unint
● 功能描述:
fm模式退出释放入口
● 函数原形:
static void fm_app_unint(void)
● 输入参数描述无
● 输出参数描述:
无
fm_event_handler
● 功能描述:
版权所有,侵权必究 8
fm模式的设备消息和按键消息处理入口
● 函数原形:
static int fm_event_handler(struct sys_event *event)
● 输入参数描述
从主任务获取的消息
● 输出参数描述:
True:当前消息已经处理,不需要发送common处理 False:当前消息不是fm处理,发送到common统一处理
fm_key_event_opr
● 功能描述:
Linein消息按键处理入口
● 函数原形:
static int fm_key_event_opr(struct sys_event *event)
● 输入参数描述
事件的消息
● 输出参数描述:
True:当前消息已经处理,不需要发送common处理
False:当前消息不是fm处理,发送到common统一处理
版权所有,侵权必究 9
4. Fm api模块设计说明
4.1.模块描述
该模块主要实现了fm 的api功能。
4.2.模块接口设计
● fm_api_init
● 功能描述:
Fm读取vm信息、初始化频点
● 函数原形:
void fm_api_init()
● 输入参数描述 Param = void
● 输出参数描述:
无
● fm_api_release
● 功能描述:
Fm api 的一些资源释放
● 函数原形:
void fm_api_release()
● 输入参数描述 Param = void
● 输出参数描述:
无
● fm_scan_up、 fm_scan_down
● 功能描述:
Fm 半自动搜台功能,搜索下一个频点
● 函数原形:
void fm_scan_up()、 void fm_scan_down()
● 输入参数描述 Param = void
● 输出参数描述:
无版权所有,侵权必究 10
● fm_scan_all
● 功能描述:
Fm 全自动搜台功能,搜索所有频点
● 函数原形:
void fm_scan_all()
● 输入参数描述
Param = void
● 输出参数描述:
无
● fm_prev_freq、 fm_next_freq
● 功能描述:
Fm 设置下一个频点
● 函数原形:
void fm_prev_freq()、 void fm_next_freq()
● 输入参数描述
Param = void
● 输出参数描述:
无
● fm_prev_station、 fm_next_station
● 功能描述:
Fm 根据vm信息设置下一个频道
● 函数原形:
● void fm_prev_station()、void fm_next_station()
● 输入参数描述
Param = void
● 输出参数描述:
无
● fm_volume_pp
● 功能描述:
Fm 暂停、播放
● 函数原形:
● void fm_volume_pp()
● 输入参数描述
Param = void
● 输出参数描述:
无
版权所有,侵权必究 11
5. Fm vm模块设计说明
5.1.模块描述
该模块主要用来保存fm搜台信息。
5.2.模块接口设计
● get_total_mem_channel
● 功能描述:
获取vm保存的fm频道数
● 函数原形:
● u16 get_total_mem_channel(void)
● 输入参数描述 Param = void
● 输出参数描述:
频道数
● get_channel_via_fre
● 功能描述:
根据真实频点获取频道
● 函数原形:
● u16 get_channel_via_fre(u16 fre)
● 输入参数描述真实频率
● 输出参数描述:
频道
● get_fre_via_channel
● 功能描述:
根据频道获取虚拟的频点
● 函数原形:
● u16 get_fre_via_channel(u16 channel)
● 输入参数描述频道
● 输出参数描述:
虚拟频点
● clear_all_fm_point
版权所有,侵权必究 12
● 功能描述:
清理vm频道信息
● 函数原形:
● void clear_all_fm_point(void)
● 输入参数描述
无
● 输出参数描述:
无
● save_fm_point
● 功能描述:
保存频点,用于搜台时候保存有效的频点
● 函数原形:
● void save_fm_point(u16 fre)
● 输入参数描述
真实频点
● 输出参数描述:
无
● delete_fm_point
● 功能描述:
删搜索到的有效频点
● 函数原形:
● void delete_fm_point(u16 fre)
● 输入参数描述
虚拟频点
● 输出参数描述:
无
● fm_last_ch_save
● 功能描述:
保存最近一次操作的频道
● 函数原形:
● void fm_last_ch_save(u16 channel)
● 输入参数描述
频道
● 输出参数描述:
无
● fm_last_freq_save
● 功能描述:
保存最近一次操作的频点
● 函数原形:
版权所有,侵权必究 13
● void fm_last_ch_save(u16 channel)
● 输入参数描述
真实频点
● 输出参数描述:
无
● fm_save_info
● 功能描述:
保存vm信息
● 函数原形:
● void fm_save_info(FM_INFO *info)
● 输入参数描述
Vm信息结构体
● 输出参数描述:
无
● fm_read_info
● 功能描述:
保存vm信息
● 函数原形:
● voidfm_read_info(FM_INFO *info)
● 输入参数描述
Vm信息结构体
● 输出参数描述:
无
版权所有,侵权必究 14
6. Fm调试说明
6.1.基本配置
#define TCFG_FM_ENABLE ENABLE_THIS_MOUDLE // fm收音使能
//以下使能目前已有驱动的FM模块
#define TCFG_FM_INSIDE_ENABLE ENABLE //使能内置FM
#define TCFG FM RDA5807 ENABLE DISABLE
#define TCFG FM BK1080 ENABLE DISABLE
#define TCFG_FM_QN8035_ENABLE DISABLE
//以下是使用外挂FM使用模拟输入时做的一些配置
// 走模拟通道,使用的ladc通道,需要与TCFG_FMIN_LR_CH 的序号一致#define TCFG FMIN LADC IDX 1
//走模拟通道,使用的ladc通道
#define TCFG FMIN LR CH AUDIO LIN1 LR
//使用模拟通道
#define TCFG FM INPUT WAY LINEIN INPUT WAY ANALOG
说明:
①内置FM接入芯片只有数字输入。
②.外挂FM接入芯片有模拟输入也有数字输入。使用模拟输入时,需要按以上模拟通道配置,实际上是使用了一路linein通道;当使用数字通道时,TCFG_FM_INPUT_WAY需要配置为 LINEIN_INPUT_WAY_ADC。
2、 起始频点和搜台步进设置
文件:fm_manage.h
说明:REAL_FREQ_MIN则代表应用fm频率的最小频点,用户可以自行修改,应用层和vm操作可以自动适配。REAL_FREQ_MAX代表fm频率的最大频点。FM_STEP 100表示步进为 100KHZ 的搜索频点,用户可以修改了50、或者200步进,应用层是根据虚拟频点进行操作,可以自行适配。
版权所有,侵权必究 15
6.2.模块扩展
收音流程中,采用统一的接口方式来兼容多种收音模块。不同收音模块,只需要提供以下功能函数即可添加到收音流程中:
①启动/初始化函数
②关闭函数
③设置频点函数
④设置音量函数
⑤获取模块ID 函数以内置FM为例:
6.3.内置FM说明
1、 内置FM清晰与不清晰电台特征判断
①清晰正常电台的特征:固定时间内的,对信号过零点统计值seek_cnt在相对较小的范围内,且信噪比cnr 的值比较大。
②无台(白噪声)或不清晰的电台特征: seek_cnt一般比较大, cnr相对较小。
2、 内置FM一般调试方式
①按默认的参数配置搜台,如果搜台不满足要求,先检测硬件,硬件没有问题,则继续第②步。
②执行一次搜台(按键消息 KEY_FM_SCAN_ALL_UP 或者KEY_FM_SCAN_ALL_DOWN),程序中开打印,初步统计一下各电台的过零点seek_cnt,信噪比cnr。
典型搜台打印参数如下:
[fr eq : 875 seek_cnt : 554 cnr : 22][fr eq : 876 seek_cnt : 385 cnr:-21][fr eq : 877 seek_cnt : 545 cnr : 0]
根据需要调节信噪比阈值fm_config_dat.cnr,及过零点取值范围
[fm_config_dat.seek_cnt_min , fm_config_dat.seek_cnt_max],当(cnr >= fm_config_dat.cnr)) && (fm_config_dat.seek_cnt_min <= seek_cnt) && (seek_cnt <=版权所有,侵权必究 16
fm_config_dat.seek_cnt_max])时,则当前电台判断为真台,否则判断为假台.
注意: 搜台时同时打印seek_cnt和cnr信息,需要先调用以下函数打开库中的相关打印。
//1打开库中的打印. 0 关闭库中的打印.
fm_inside_io_ctrl (SET_FM_INSIDE_PRINTF, 1) ;
若怀疑搜台时库中开打印,会影响到搜台参数,可以在搜台时关掉打印,搜完台时,在下面的函数统一把搜台参数打印出来(搜台时,已先把参数存到内部RAM 中)
//打印87.5到108.0 的搜台参数.
fm_insice_scan_info_printf (875, 1080) ;
3、 常见搜台问题处理
①收台数量不够:先调低fm_config_dat.cnr,若还不行,再放宽[fm_config_dat.seek_cnt_min , fm_config_dat.seek_cnt_max]。
②假台数量过多:先调高fm_config_dat.cnr,再缩窄[fm_config_dat.seek_cnt_min, fm_config_dat.seek_cnt_max].
代码如下:
4、 其他内置FM 的API 函数
①void fm_inside_set_stereo(u8 set) ; //双声道(立体声)效果设置. set取值范围[0, 128]. set值为0时,相当于完全的单声道.
set 的值越接近 128时,双声道效果越明显,
set值为 128时为双声道.
②void fm_inside_set_abw(u8 set) ; //音频带宽设置, set取值范围[0, 128]. set 的值越大,音频带宽越宽.带宽可调范围[2k, 16k]
③void fm_inside_deempasis_set(u8 set) ; //去加重参数设置. set 只能设置为0 或 1. set值为0时,去加重时间参数为50us.
set值为 1时,去加重时间为75us.
④s16 fm_inside_rssi_read ( void) ; //收音RSSI值获取.单位为dB.
版权所有,侵权必究 17
6.4.内置FM快速调试
假台多:
无天线:
a.提高CNR
b.提高DIFFER_P_S_ANT
c .降低DIFFER_N 有天线:
a.提高CNR
b.提高DIFFER_P_L_ANT 真台少:
无天线:
a.降低CNR
b.降低DIFFER_P_S_ANT
c.提高DIFFER_N 有天线:
a.降低CNR
b.降低DIFFER_P_L_ANT 叠台多:
降低AGC_N_AVG 长短天线判别N_L_S_ANT:
尽量使用 15~20cm天线时的noise_avg。过零点数SEEK_CNT:
人声的过零点数通常是在512左右。
6.5.内置FM硬件
1、 选频网络
选频网络可以提高FM6dBm 的灵敏度
2、 天线走线
①无地天线
直接FMIP天线引脚出来经过选频网络,立马打孔拉天线,减少地对天线的干扰。
②有地天线
直接FMIP天线引脚出来经过选频网络,立马打孔拉天线,其次,FM无需分地处理,直接大面积回芯片地,保证芯片部分地完整,保证芯片地到电池地回路完整。
3、 功放类型
版权所有,侵权必究 18
不能使用D类功放
6.6.内置FM参数介绍
请查看参数注释:

6.7.搜台参数设定
1、 假如对比收音机只能收到:91. 5M、 99. 1M、 99.3M三个有人声的台。
2、 我们的收音机(插天线):
①、 开库打印
版权所有,侵权必究 19
②、 长短天线的判断阈值
作用:区分长短天线,提高真假台的判断正确率。短天线需要power_differ和noise_differ,长天线只需要 power_differ。
操作:
寻找一根 15~20cm 的软线,焊在电路天线焊盘上。
按键搜台,记录AGC打印的noise平均值。
参数更改:
③、 AGC 阈值
作用:匹配最优的增益等级。 当信号较弱时,提高增益等级,从而提高真台率;当前信号较强时,降低增益等级,从而减少叠台率。
说明:叠台是内部LPF 的增益过大,多个频点的能量泄漏叠加产生的电台。
操作:在信号较强的地方(室外),用一根 1米(甚至更长的天线),搜台或者随便切几个台,如果发现有叠台,则把阈值降低,让AGC判定在更低的阈值下,降低增益。反之,提高阈值,可以提高弱台搜索率。
参数更改:
④、 CNR、 SEEK CNT、DIFFER 阈值
插上天线(最好是客户最终使用的天线),听台,并记录91.5M、 99. 1M、 99.3M 的打印
说明:依次切到每个频点,听我们的收音机是否有电台声音,如果有,那么就有机会搜到,如果没有,
那么就跳过这个频点。然后记录有电台声的频点信息,具体如下:
切频点:
不插天线,同样操作一遍。
插天线打印: (此次搜台是从108M~ 87.5M)
版权所有,侵权必究 20

不插天线打印: (此次搜台是从 108M~ 87.5M)

筛选出最小cnr、 最小seek_cnt、 最大seek_cnt。
单独筛选出插天线最小power_differ。
单独筛选出不插天线最小power_differ和最大noise_differ。
CNR:7 //值越大越严
SEEK_CNT_MIN:424 //值越大越严
SEEK_CNT_MAX:511 //值越小越严
DIFFER_P_L_ANT:7 //值越大越严
DIFFER_P_S_ANT:6 //值越大越严
DIFFER_N:10 //值越小越严
版权所有,侵权必究 21
阈值稍微放宽 CNR:5
SEEK_CNT_MIN:400
SEEK_CNT_MAX:550
DIFFER_P_L_ANT:6
DIFFER_P_S_ANT:5
DIFFER_N:11
⑤、 设置晶振谐波的cnr 阈值
说明: 由于96M和108M是晶振24M 的谐波,导致这两个频点的载噪比cnr会比较大。所以我们要单独提高这两个频点的cnr。
找一个封闭的房间,调到96M和108M 的频点,分别筛选出这两个频点的最大cnr,更新参数即可。
、
6.8.内置FM常用接口
1.外界立体声标识获取

2.收音立体声设置

3.带宽设置
版权所有,侵权必究 22
版权所有,侵权必究 23