搜索
bottom↓
回复: 8

分享FPGA FM发射工程

[复制链接]

出0入0汤圆

发表于 2018-8-13 19:50:04 | 显示全部楼层 |阅读模式
本帖最后由 zkf0100007 于 2018-8-13 19:51 编辑

最开始是从树莓派的PiFM了解到,大牛用树莓派通过GPIO实现了FM发射,惊为天人。
当时想,树莓派可以做到的,FPGA应该也可以做到,上网一搜,还真有不少例子,选了一个老毛子的,比较简单,在zedboard上实现了一把。
实现思路如下:
假设中心频率为100MHz,最大调制频偏为50KHz,如果按8bit量化,则将50 kHz的整个间隔分成256段,我们计算了所有256个频率和相应的系数M.对于这个计算,我在C上写了一个程序:
  1. #include "stdafx.h"
  2. #define BASE_FREQ 500000000
  3. #define CARRIER 100000000
  4. #define BAND 50000
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7.     double freq_wish;
  8.     double divider;
  9.     double m;
  10.     printf("WIDTH = 16;\n");
  11.     printf("DEPTH = %d;\n",256);
  12.     printf("ADDRESS_RADIX = HEX;\n");
  13.     printf("DATA_RADIX = HEX;\n");
  14.     printf("CONTENT BEGIN\n");
  15.     for(int i=0; i<256; i++)
  16.     {
  17.         freq_wish = CARRIER + BAND*i/256;
  18.         divider = BASE_FREQ / freq_wish;
  19.         m=(divider-4)/(5-divider);
  20.         //printf("freq %f div %f %f %d\n",freq_wish,divider,m,(int)(m+0.5));
  21.         printf("%04X: %04X;\n",i,(int)(m+0.5));
  22.     }
  23.     printf("END\n");
  24.     return 0;
  25. }
复制代码

但是如何实现调频呢,解决方案结果非常简单。 我们需要采用一些相当高的频率,例如500MHz,然后除以5得到100MHz,或除以分数分频器,比如4.9998,接近100MHz,但仍然略有不同的频率:100004000Hz 。 也就是说,您需要对频率进行小数除法。 好吧,除了5,计数器很容易。 但是如何划分为分数除数? 事实上,通过数字方法我们只能模仿分数。 让我们这样说吧:我们将500MHz的原始高频几乎总是除以5,但有时很少除以4.然后插入时的平均脉冲通量“除以4”将增加。 插入“除以4”越多,平均输出频率越高。 以下是此划分方法的说明:

完整的ISE工程如下,注意我用的是山寨ZEDBOARD,板载PL时钟为100M,正版的ZEDBORAD是50M


用matlab生成了两个单音信号,用做音频测试,代码如下
  1. fs = 44100/2; %采样频率

  2. T = 1/fs; %采样周期

  3. time1 = 0.7; %第一个声音片段的总时长

  4. time2 = 0.1;

  5. time3 = 0.686;

  6. freq1 = 261; %第一个声音片段的频率(音调)

  7. freq2 = 0;

  8. freq3 = 1000;

  9. vol1 = 127; %第一个声音片段的音量

  10. vol2 = 0;

  11. vol3 = 100;

  12. tone1 = 128+sin(2*pi*freq1*(0:T:time1))*(vol1); %生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude。

  13. tone2 = sin(2*pi*freq2*(0:T:time2))*(db2mag(vol2));

  14. tone3 = 128+sin(2*pi*freq3*(0:T:time3))*(vol3);

  15. Tone = [round(tone1), round(tone2), round(tone3)]; %组合所有声音片段

  16. sound(Tone,fs) %可以播放声音的函数 sound()

  17. fid_s = fopen('music_rom.coe', 'wt');
  18. fprintf(fid_s, '%s\n', 'MEMORY_INITIALIZATION_RADIX = 16;');
  19. fprintf(fid_s, '%s\n', 'MEMORY_INITIALIZATION_VECTOR =');

  20. for (i=1:32768)
  21.     fprintf(fid_s, '%d', Tone(i));
  22.     fprintf(fid_s, '%s', ',');
  23. end

复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2018-8-13 21:52:40 来自手机 | 显示全部楼层
厉害

出20入25汤圆

发表于 2018-8-13 22:09:22 来自手机 | 显示全部楼层
pifm的原理有链接么

出0入0汤圆

发表于 2018-8-13 22:17:12 来自手机 | 显示全部楼层
我也说一句我还是用ad9850简单些。

出0入0汤圆

 楼主| 发表于 2018-8-14 10:07:23 | 显示全部楼层
chenchaoting 发表于 2018-8-13 22:09
pifm的原理有链接么

https://github.com/markondej/fm_transmitter

出0入0汤圆

 楼主| 发表于 2018-8-14 10:07:54 | 显示全部楼层
XA144F 发表于 2018-8-13 22:17
我也说一句我还是用ad9850简单些。

那肯定了,用FPGA来做只是玩玩而已

出0入0汤圆

发表于 2018-11-28 16:36:19 | 显示全部楼层
楼主厉害

出0入0汤圆

 楼主| 发表于 2018-12-5 23:49:37 | 显示全部楼层
正版的ZEDBORAD PL时钟也是100M
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 22:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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