矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2750|回复: 12

STM32-F407VG-SDR-中波直采

[复制链接]
     
发表于 2023-10-1 02:33:48 | 显示全部楼层 |阅读模式
本帖最后由 LoveVirus 于 2023-10-1 02:57 编辑

SDR开发还是一个蛮复杂的任务,上次虽然用python把基本流程跑通了,但是移植到具体的单片机上时还是遇到了不少的困难,突破困难后再看以前遇到的问题可能简单的不值一提,

由于基础差,sdr依赖的知识点又比较多,在未突破前几乎是困难重重,但是最终突破后的成就感还是令人欣慰的。

***************************************************************************************************

workflow.png

这是我设计的流程图

初期为了简化硬件依赖,尽可能充分利用单片机内的自带资源,架构采用的是中波直采架构,

直采架构的优点是不用因硬件变频而需再引入si5351和模拟开关

天线信号,经过LNA低噪放大,直接进入单片机的ADC引脚进行采样,ADC的采样率设置的是2.4M理论上讲可以接收1.2M以内的中波信号

数字化的射频信号经DDC数字下变频,分解为IQ信号,

由于经过下变频,此时的IQ信号在基带,已经不需要2.4M的采样率,下一步经过DEC数据抽取降低到48K,

48K的IQ信号经过AM解码转变为音频数字信号

音频数字信号经过dac转换为模拟信号

模拟信号再经LM386放大后驱动喇叭

***************************************************************************************************

LNA.png
这是我设计的LNA的电路图,为了简化低通网滤波,我直接用磁棒天线和可调电容调谐到一个固定的频率

在LNA上我卡了很长一段时间,最初犯了一个低级而致命的错误,LNA放大倍数不够而导致无法采集到足够的射频信号,因中波信号强度在10uv-到100uv,

经过一级放大有时信号太弱

***************************************************************************************************
lna-20倍.png


这是我放大20倍时的信号波形,可以看到峰峰值只有4mv,此时经过ad转换后无法进行后续解析出音频信号

***************************************************************************************************

lna-400倍.png

这是我增加一级放大后,20x20=400倍的信号波形,可以很明显的看到AM信号了,你们可能想象不到当我看到这个AM波形时自己激动的心情无法言表

***************************************************************************************************
项目依赖.png


这是项目的依赖列表

单片机我选用的是stm32f407vg,选用f4主要是看中f4具有浮点运算能力

开发工具我还是选用我熟悉的vscode

插件还是platfromio

框架是选用的stm32cube框架,也就是基于HAL库来进行的单片机编程

***************************************************************************************************

由于是用stm32cubeide进行的可视化配置,我这里把核心配置做一个说明

工程配置.png

工程配置,代码生成勾选第一个选项

***************************************************************************************************
时钟配置.png


时钟配置144M,这样PCLK2为72M,二分频后36M,36M/15=2.4M可以达到f407的最大采样率

***************************************************************************************************

sys配置.png

SYS配置Timebase Source为SysTick

***************************************************************************************************

rcc配置.png

RCC配置时钟为外部晶振

***************************************************************************************************

adc配置.png

ADC1采用通道IN0,时钟二分频,12位精度,数据右对齐,开启持续转换,开启DMA请求,为了达到最大采样率,使用软件启动

***************************************************************************************************
adc-dma配置.png


DMA开启循环模式,内存指针递增,数据宽度半字

***************************************************************************************************

dac配置.png

DAC开启通道1,启用缓存,time6触发

***************************************************************************************************

dac-dma配置.png

DMA开启循环模式,内存指针递增,数据宽度半字

***************************************************************************************************
tim6配置.png


启用TIM6,72分频,计数模式向上,计数装填21,这样72M/72/21=47.6K,开启自动装填,触发事件为updateEvent

***************************************************************************************************
项目结构.png


这是项目结构

***************************************************************************************************

docs.png

docs是相关截图说明文件

***************************************************************************************************

include.png

include是头文件

***************************************************************************************************
dsp.h.png


dsp.h只公开了compute_lo,process_sig两个函数

***************************************************************************************************


main.h.png
main.h是公共头文件和常量

***************************************************************************************************

src-core.png

src/core文件夹下的内容是通过stm32cubeide可视化工具配置自动生成的代码原样复制过来的,这里面的文件不建议直接修改,方便后期在可视化工具变更后同步覆盖

***************************************************************************************************
dsp.c.png


dsp.c文件是dsp处理的核心文件,几乎所有的dsp相关处理逻辑都在这里,为了提高性能,调用了cmsis-dsp库函数

***************************************************************************************************

lo_iq.png

lo_i,lo_q是NCO查表数据变量

***************************************************************************************************

compute_lo.png

compute_lo是根据选择的频率生成NCO查表数据

***************************************************************************************************

mix_sig.png

mix_sig是数字混频函数

***************************************************************************************************

sum_filter.png

sum_filter是我自己编写的移动求和过滤抽取器,后面会用多级cic进行替代

***************************************************************************************************

demod_am.png

demod_am是am解码函数

***************************************************************************************************

int2float.png

int2float是把数字射频信号映射到[-1,1]之间方便混频,混频数据值也在[-1,1]这个范围

***************************************************************************************************

float2int.png

float2int是把[-1,1]范围的数据重新映射到[0,4096]之间

***************************************************************************************************

process_sig.png

process_sig是把上面的dsp处理逻辑串联起来进行数据处理

***************************************************************************************************

main.c.png

main.c是程序主文件

***************************************************************************************************


adc-value.png
adc_value,dac_value是adc,dac数据存储变量

***************************************************************************************************

Error_Handler.png

Error_Handler是异常处理函数

***************************************************************************************************

SystemClock_Config.png

SystemClock_Config是系统时钟配置函数

***************************************************************************************************

main.png

main函数是程序入口文件,在这里进行硬件初始化设置

***************************************************************************************************

HAL_ADC_ConvHalfCpltCallback.png

HAL_ADC_ConvHalfCpltCallback,HAL_ADC_ConvCpltCallback是adc采集一半和完成回调,回调函数里面把adc数据传递给process_sig进行数据处理,处理后的音频数据填充到dac

***************************************************************************************************

add_hardfloat.py.png

platformio.png

这里有个注意事项就是platfromio默认配置是未开启浮点运算的,需要增加一个脚本和配置项才能正常启用浮点运算

***************************************************************************************************
test.python.png


Test目录是我用python写的算法测试

creatSignal是模拟信号创建

sum_filter是滑动求和过滤器

compute_lo是NCO数据表创建

***************************************************************************************************

compte-lo.png

sum-filter.png



我们来测试一下NCO数据表创建和滑动求和过滤器

***************************************************************************************************

项目工程介绍完了,我们来试听一下效果,由于未进行进一步的滤波处理,噪音较大,但是能够出声,说明整体逻辑是正确的,这是艰难而伟大的一步跨越,为后续学习优化奠定了基础。

项目地址:direct-rf分支

https://gitee.com/zhuxianguo/stm32-f407vg-sdr

视频链接:

【STM32-F407VG-SDR-中波直采架构-哔哩哔哩】 https://b23.tv/ohKx7ZD

评分

5

查看全部评分

     
发表于 2023-10-1 07:59:24 | 显示全部楼层
做SDR最枯燥、也是最有興味的精髓是信號解調,搞明白相闗的數學變換過程,就可以寫自己的函數了。
回复 支持 反对

使用道具 举报

     
发表于 2023-10-1 20:44:12 | 显示全部楼层
很棒的项目,后续应该可以通过数字滤波降噪
回复 支持 反对

使用道具 举报

     
发表于 2023-10-1 22:06:02 | 显示全部楼层
本帖最后由 iffi123 于 2023-10-1 22:07 编辑

我记得老外有做一个叫arm radio的收音机,是用F429开发板外加电路实现中波直采的,提供了电路和算法实现

这是它的主页  https://hackaday.io/project/171053-arm-radio-for-system-workbench

12.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-1 22:27:51 | 显示全部楼层
iffi123 发表于 2023-10-1 22:06
我记得老外有做一个叫arm radio的收音机,是用F429开发板外加电路实现中波直采的,提供了电路和算法实现

...

这个项目有在看,不过还没完全理解这个项目的算法
回复 支持 反对

使用道具 举报

发表于 2023-10-1 23:25:58 | 显示全部楼层
本帖最后由 girlexplorer 于 2023-10-2 00:25 编辑

非常好。

可惜老衲不懂c语言。如果源码是basic就好了,老衲可以研究学习一下dsp变频检波原理。

估计至少99%的坛友搞不懂数字信号的变频检波原理。
模拟信号或多或少知道一些。

回复 支持 反对

使用道具 举报

     
发表于 2023-10-2 10:27:44 来自手机 | 显示全部楼层
流程图中文就好了,有几个没有看懂是什么意思,简单的应该这样吧:AD采集—数字信号处理—DA转换—功放—喇叭
回复 支持 反对

使用道具 举报

发表于 2023-10-2 10:51:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-2 14:07:34 | 显示全部楼层
本帖最后由 LoveVirus 于 2023-10-2 14:10 编辑
hongo 发表于 2023-10-2 10:51
先用两个9018做模拟射频放大,然后送到STM32单片机直接对射频信号进行AD转换,得到的数据用一个预定接 ...


是这个流程,不过我发现我构造的nco表有一点问题,后面会修正这个问题
回复 支持 反对

使用道具 举报

     
发表于 2023-10-2 14:35:11 来自手机 | 显示全部楼层
hongo 发表于 2023-10-2 10:51
先用两个9018做模拟射频放大,然后送到STM32单片机直接对射频信号进行AD转换,得到的数据用一个预定接 ...

为什么要用90度的信号混频呢,直接数字解调不可以啊,搞的好复杂
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-2 15:06:41 来自手机 | 显示全部楼层
本帖最后由 LoveVirus 于 2023-10-2 15:46 编辑
  2023-10-2 14:35 为什么要用90度的信号混频呢,直接数字解调不可以啊,搞的好复杂


实际AM信号完全可以不用IQ解调,用数字半波检波,IQ信号优势更多的是可以解调SSB边带信号,ASK,FSK,PSK等数字信号,这里用IQ信号解调AM纯粹是因为AM信号算法最简单,方便学习信号处理入门而已
回复 支持 反对

使用道具 举报

     
发表于 2023-10-2 21:24:35 | 显示全部楼层
楼主这个实践非常好!

接收效果试听中背景噪声较大,这是信号最强的电台吗?

如果电台信号够强,不变频直接检波然后进DAC,是否噪声仍然较大?

据说STM32的ADC本底噪声大,不知道是否这个原因。如果是的话,外挂性能更好的ADC或许能解决。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-10-2 21:43:48 | 显示全部楼层
HenryYam 发表于 2023-10-2 21:24
楼主这个实践非常好!

接收效果试听中背景噪声较大,这是信号最强的电台吗?

嗯,噪音比较大,一是目前未进行更近一步的滤波处理,stm32自带的adc底噪问题也可以测试下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-5-5 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表