zkf0100007 发表于 2018-8-13 19:50:04

分享FPGA FM发射工程

本帖最后由 zkf0100007 于 2018-8-13 19:51 编辑

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

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

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


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

T = 1/fs; %采样周期

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

time2 = 0.1;

time3 = 0.686;

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

freq2 = 0;

freq3 = 1000;

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

vol2 = 0;

vol3 = 100;

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

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

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

Tone = ; %组合所有声音片段

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

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

for (i=1:32768)
    fprintf(fid_s, '%d', Tone(i));
    fprintf(fid_s, '%s', ',');
end



hxled123 发表于 2018-8-13 21:52:40

厉害

chenchaoting 发表于 2018-8-13 22:09:22

pifm的原理有链接么

XA144F 发表于 2018-8-13 22:17:12

我也说一句我还是用ad9850简单些。

zkf0100007 发表于 2018-8-14 10:07:23

chenchaoting 发表于 2018-8-13 22:09
pifm的原理有链接么

https://github.com/markondej/fm_transmitter

zkf0100007 发表于 2018-8-14 10:07:54

XA144F 发表于 2018-8-13 22:17
我也说一句我还是用ad9850简单些。

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

308594151 发表于 2018-11-28 16:36:19

楼主厉害

zkf0100007 发表于 2018-12-5 23:49:37

正版的ZEDBORAD PL时钟也是100M
页: [1]
查看完整版本: 分享FPGA FM发射工程