软件无线电1-MATLAB实现FM调制解调

打印 上一主题 下一主题

主题 529|帖子 529|积分 1587



1、MATLAB读取语音文件

      准备一段wav的语音文件,我用笔记本自带的灌音机录制了一段自己的语音“爱福皮的姐.wav“,MATLAB读取语音文件,并获取采样率信息。
  1. clc;
  2. clear all;
  3. %% ***************read file*************************************
  4. filename ='./data_source/爱福皮的姐.wav';
  5. [m,fm]= audioread(filename);% fm = 48e3; %音频的采样率
  6. sound(m,fm);
  7. figure(1);
  8. plot(m);title('原始的语音信号');
复制代码
这段原始语音采样率48kHz,时域波形如图1所示,

2、FM调制

根据FM调制数学表达式:
生成FM信号。
2.1相干参数设置和语音数据源初处理

       我是用的载波频率192kHz,载波采样率1.92MHz,代码里雷同这些参数大家可以根据自己的需求修改。FM宽带调制最大频偏75kHz,FM窄带调制最大频偏5kHz。由于FM调制是用基带信号控制载波的频率,即与载波信号数据相乘,所以在这之前,我们须要将基带信号的采样率和长度举行处理,使其与载波信号采样率和长度保持同等,处理代码如下:
  1. fs = 1.92e6; %采样率 载波的采样率
  2. fc = 192e3; %载波中心频率
  3. df = 75e3; %最大频偏  宽带75khz   窄带时5khz
  4. kf = (df*2^32/fs)/32767;
  5. AC= 1024;%幅度
  6. dt=1/fs;
  7. m_len=length(m)*fs/fm;%按照载波采样率的长度计算
  8. m_t=zeros(1,m_len);
  9. for i=1:length(m)
  10.     for j=1:fix(fs/fm)
  11.         m_t((i-1)*fix(fs/fm)+j)=m(i);
  12.     end
  13. end
复制代码
2.2基带信号FM调制生成基带IQ信号

查表法实现信号发生器,MATLAB产生DDS,代码如下:
  1. %************************* FM调制 ********************
  2. n=0:1/1024:1023/1024;
  3. s_rom=sin(2*pi*n);
  4. c_rom=cos(2*pi*n);
  5. w_r=0;%相位累加器
  6. rrom_addr=0;%
  7. dac_i=zeros(1,m_len);%I路信号
  8. dac_q=zeros(1,m_len);%Q路信号
  9. for i=1:m_len
  10.     w_r = w_r + kf*m_t(i);
  11.     if(w_r > 2^32) % 做32位累加器的溢出判断
  12.         w_r= w_r - 2^32;
  13.     elseif(w_r <0)
  14.         w_r = w_r + 2^32; % 负的溢出时
  15.     end
  16.    
  17.     rrom_addr=round(w_r/2^22);%读查找表的地址
  18.     if rrom_addr == 0
  19.         rrom_addr =1;
  20.     end
  21.     dac_q(i)=AC*s_rom(rrom_addr);
  22.     dac_i(i)=AC*c_rom(rrom_addr);
  23. end
复制代码
 2.3 生成载波IQ信号

查表法实现信号发生器,MATLAB产生DDS,代码如下:
  1. %*****************************载波信号 *********************************
  2. w=fc*2^32/fs; %频率控制字,32位的相位累加器, f_out  = fs*w/2^N :
  3. n=0:1/1024:1023/1024;
  4. s_rom=sin(2*pi*n);
  5. c_rom=cos(2*pi*n);
  6. %接下来产生载波地址,
  7. w_r=0;%相位累加器
  8. rrom_addr=0;%
  9. cw_sin=zeros(1,m_len);%这个相当于是我们的查找表,一个周期的正弦波
  10. cw_cos=zeros(1,m_len);
  11. for i=1:m_len
  12.     w_r = w_r + w;
  13.     if(w_r > 2^32) % 做32位累加器的溢出判断
  14.         w_r= w_r - 2^32;
  15.     end
  16.     rrom_addr=round(w_r/2^22);%读查找表的地址
  17.     if rrom_addr == 0%matlab计数时从1开始计数
  18.         rrom_addr =1;
  19.     end
  20.     cw_sin(i)=s_rom(rrom_addr);%载波完成
  21.     cw_cos(i)=c_rom(rrom_addr);%载波
  22. end
  23. figure(2);
  24. subplot(2,1,1);plot(cw_sin(1:3000),'r');title('sin载波信号');
  25. subplot(2,1,2);plot(cw_cos(1:3000),'b');title('cos载波信号');
复制代码
载波信号时域波形如图2所示。

图2 载波信号时域波形

2.4 生成FM信号

基带IQ信号分别和载波IQ信号相乘,之后相加,得到FM信号。
  1. %******************* FM信号 *******************
  2. s_t=zeros(1,m_len);
  3. for i=1:m_len
  4.     s_t(i) = dac_i(i)*cw_cos(i) + dac_q(i)*cw_sin(i)*(-1);
  5. end
  6. figure(3);
  7. subplot(2,1,1);plot(s_t);title('FM信号');
  8. subplot(2,1,2);psd(s_t,fs);title('FM信号频谱');
复制代码
FM窄带调制生成的FM信号时域波形和频谱如图3所示。

图3 FM窄带调制生成的FM信号时域波形和频谱

FM宽带调制生成的FM信号时域波形和频谱如图4所示。

图4 FM宽带调制生成的FM信号时域波形和频谱

3 FM干系解调

3.1 去除高频分量

干系解调首先将FM信号与载波信号IQ信号相乘,然后颠末低通滤波器,滤除高频分量。
  1. %% 解调方法一   %*******************相干解调 ok*******************
  2. %%%%%%%%%%%%正交解调%%%%%%%%%%%%%%%%
  3. i_data = zeros(1,m_len);
  4. q_data = zeros(1,m_len);
  5. for i = 1 : m_len
  6.         i_data(i) = s_t(i) * cw_cos(i);
  7.         q_data(i) = (-1)* s_t(i) * cw_sin(i);
  8. end
  9. %%%%%%%%%%%%%%进行低通滤波%%%%%%%%%%%%%%%%
  10. %滤波器系数
  11. f20k= [-4.49340747782e-05,0.00010035338004,0.00018271359187,0.000333071475,……];
  12. adc_i=filter(f20k,1,i_data);
  13. adc_q=filter(f20k,1,q_data);
复制代码
滤波器系数获取步调:
步调1:使用MATLAB自带的滤波器设计工具,即fdatool获取滤波器系数。在MATLAB命令窗口输入fdatool回车,弹出滤波器设计工具
步调2:滤波器参数设置。
选择低通滤波器,然后设置采样率、通带、阻带等参数后,最后点击设计滤波器,期待结束,生成滤波器,如图5所示:

图5 滤波器参数设置

步调3:导出滤波器系数。

      滤波器设计工具右上角“file“下拉选择”Export“,设置导出系数的名称,覆盖原数据,导出如图6所示,在MATLAB工作区找到刚刚取的名称。


图6 导出滤波器系数

3.2 FM解调

根据如下FM解调公式,得到我们须要的数据源基带信号。

  1. %%%%%%%%%%%%%FM解调%%%%%%%%%%%%%%%%%%%%%%
  2. c_len = length(adc_i);
  3. cr = zeros(1,c_len);
  4. cj = zeros(1,c_len);
  5. for i = 2: c_len %必须从2开始,因为有I-1
  6.         cr(i) = adc_i(i)*adc_i(i) +adc_q(i)*adc_q(i);
  7.         cj(i)  = adc_i(i-1) * adc_q(i) -  adc_i(i)* adc_q(i-1);%I(n-1)*Q(n) -I(n)*Q(n-1)
  8. end
  9. angle = zeros(1,c_len);
  10. for i = 1:c_len
  11.         if cr(i) == 0
  12.                 angle(i) = 0;
  13.         else
  14.         angle(i) = (cj(i)/cr(i));
  15.         end
  16. end
复制代码
3.3 降采样率处理

       上面得到的基带信号采样率依然是1.92MHz,我们使用MATLAB自带的函数resample函数举行40倍抽取处理,将基带信号的采样率降到48kHz,为了MATLAB播放出来效果更好,将信号幅值乘10处理后播放,我们可以将原语音数据播放效果和解调后的语音数据举行比较,解调后的语音听起来效果还可以,非常清晰。
  1. %%%%%%%%%%%%%降采样%%%%%%%%%%%%%%%%%%%%%%%%%
  2. data_out1 = resample(angle,1,40);
  3. sound(data_out1*10,fm);
  4. figure(4);
  5. plot(data_out1(100:end)*10);title('FM解调信号');
复制代码
FM解调信号时域波形如图7所示。

图7 FM解调信号1

4 FM非干系解调

       非干系解调不须要提取载波信息,将接收到的FM信号颠末微分器,然后颠末希尔伯特变更和包络检波,最后去偏置,得到的基带信号采样率1.92Mhz,同样使用MATLAB自带的函数resample举行40倍抽取处理,将基带信号的采样率降到48kHz,为了MATLAB播放出来效果更好,将信号幅值除以30处理后播放,我们可以将原语音数据播放效果和解调后的语音数据举行比较,非干系解调后的语音听起来也非常清晰。
  1. %% 解调方法二  %*******************非相干解调 ok*******************
  2. for i=1:m_len-1
  3.     diff_sfm(i)=(s_t(i+1)-s_t(i))/dt;%微分器,将调频波变换成调幅调频波
  4. end
  5. diff_sfm=abs(hilbert(diff_sfm));      %希尔伯特变换移相,然后包络检波
  6. diff_sfm=(diff_sfm/AC-2*pi*fc)/kf;    %去偏置
  7. data_out2 = resample(diff_sfm,1,40);
  8. sound(data_out2/30,fm);
  9. figure(4);
  10. plot(data_out1(100:end)*10);title('FM解调信号');
复制代码
FM解调信号时域波形如图8所示。

图8 FM解调信号2

5 MATLAB里FM相干库函数实现FM调制解调

       MATLAB软件自带了许多库函数,可以直接调用。FM调制我们可以使用fmmod函数,FM解调使用demod函数,代码如下,同样也举行了降采样率处理后,播放终极处理的效果数据,解调后的语音听起来也非常清晰。
  1. %% 解调方法三   
  2. %*******************matlab 库函数调制解调 ok*******************
  3. y=fmmod(m_t,fc,fs,10);
  4. so = demod(y,fc,fs,'fm'); %FM解调
  5. data_out3 = resample(so,1,40);
  6. sound(data_out3,fm);
  7. figure(6);
  8. subplot(2,1,1);plot(y,'b');title('FM信号');
  9. subplot(2,1,2);plot(so,'r');title('FM解调信号');
复制代码
FM信号和解调信号时域波形如图9所示。

图9 FM调制信号和解调信号


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

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