FM调制解调
1.matlab仿真
先用matlab仿真,验证算法的可行性。
代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
echo off
close all
clear all
clc
%%%%%%%%%%%%%%%%%%FM调制%%%%%%%%%%%%%%%%%%%%%
ps = 625000; % 数据率625KHz
Fs = 80*10^6; % 80M采样率
dt = 1/Fs; % 采样间隔
a = 1000;
t = 0:dt:(a*Fs/ps-1)/Fs; % 产生时间序列
N = length(t)-1;
am = 5; % 设定调制信号幅度
fm = 15*10^2; % 调制信号频率
fc = 5*10^6; % 载波频率5M
mt = am*sin(2*pi*fm*t); % 生成调制信号
ct = cos(2*pi*fc*t); % 生成载波
kf = 10000; % 调频系数 频偏75kHz
integral_mt(1)=0;
for i=1:N %积分
integral_mt(i+1)=integral_mt(i)+mt(i)*dt;
end
%figure(100);plot(t,integral_mt); title('integral_mt');
sfm= am*cos(2*pi*fc*t+2*pi*kf*integral_mt); %已调信号
%%%%%%%%%%%%画图%%%%%%%%%%%%
figure(1);
subplot(311);
plot(t,mt); title('调制信号时域');
axis([0 10^(-3) -5 5]);
subplot(312);plot(t,ct); title('载波信号时域');
axis([0 10^(-5) -1 2]);
subplot(313);plot(t,sfm);title('已调信号时域');
axis([0 10^(-5) -5 5]);
%%%%%%%%%%%%画图%%%%%%%%%%%%
figure(2);
subplot(311);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(mt)))));
title('调制信号频域');
subplot(312);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(ct)))));
title('载波信号频谱');
subplot(313);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(sfm)))));
title('已调信号频域');
%%%%%%%%%%%%%%%%%%生成IQ信号%%%%%%%%%%%%%%%%%%%%%
st=imag(hilbert(ct)); %提取载波的正交分量 sin(wc*t)
ct=real(hilbert(ct)); %cos(wc*t)
for i=1:length(sfm)
Ih(i)=sfm(i)*ct(i);
Qh(i)=sfm(i)*st(i);
end
%%%%%%%%%%%%%%%%%%%%%滤波降频%%%%%%%%%%%%%%%%%%%
Flp=fc;
b=fir1(200,Flp/Fs,'low'); %设计滤波器
% figure(4);
% stem(b); %滤波器单位脉冲响应
Qm=filter(b,1,Qh);
Im=filter(b,1,Ih);
% figure(6)
% subplot(211);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Qm))));
title('Q信号波形频域');
% subplot(212);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Im))));
title('I信号波形频域');
% figure(5)
% subplot(211);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Qh))));
title('Qh信号波形频域');
% subplot(212);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Ih))));
title('Ih信号波形频域');
% figure(8)
% subplot(211);plot(t,Qm);title('Q信号波形');
% subplot(212);plot(t,Im);title('I信号波形');
% figure(7)
% subplot(211);plot(t,Qh);title('Qh信号波形');
% subplot(212);plot(t,Ih);title('Ih信号波形');
%%%%%%%%%%%%%进行16bit量化%%%%%%%%%%%%%%%%%
Qm16=round(Qm/max(abs(Qm))*(2^15-1));
Im16=round(Im/max(abs(Im))*(2^15-1));
%求系数绝对值之和,以此估计滤波后的有效数据位宽
sum_Shape=sum(abs(Qm16));
%%%%%%%%%%%%%%%%%%%解调%%%%%%%%%%%%%%%%%%%
Sn(1)=0;
for i=2:length(Qm)
Sn(i) =-(Qm16(i)*Im16(i-1)-Qm16(i-1)*Im16(i));
end
Sn=Sn/max(abs(Sn));
%%%%%%%%%%对解调信号进行滤波消除噪声%%%%%%%%%
Flp1=2*10^5;
a=fir1(200,Flp1/Fs,'low'); %设计滤波器
% figure(4);
% stem(b); %滤波器单位脉冲响应
Sn=filter(a,1,Sn);
%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%
figure(11);
subplot(411);
plot(t,Sn);title('解调信号波形');
%axis([0 2*10^(-3) -1 1 ]);
subplot(412);plot(t,mt);
title('原始信号波形');
%axis([0 2*10^(-3) -5 5 ]);
subplot(413);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(Sn)))));
title('解调信号频域');
%axis([-10000 10000 0 50000]);
subplot(414);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(mt)))));
title('原始信号频域');
%axis([-10000 10000 0 500000]);
%%%%%%%%%将有符号十进制转化为二进制%%%%%%%%%%%%%
fid=fopen('E:FMMATLABQm.txt','w');
for k=1:length(Qm16)
B_s=dec2bin(Qm16(k)+(Qm16(k)<0)*2^16,16);
for j=1:16
if B_s(j)=='1'
tb=1;
else
tb=0;
end
fprintf(fid,'%d',tb);
end
fprintf(fid,'rn');
end
fprintf(fid,';');
fclose(fid);
fid=fopen('E:FMMATLABIm.txt','w');
for k=1:length(Im16)
B_s=dec2bin(Im16(k)+(Im16(k)<0)*2^16,16);
for j=1:16
if B_s(j)=='1'
tb=1;
else
tb=0;
end
fprintf(fid,'%d',tb);
end
fprintf(fid,'rn');
end
fprintf(fid,';');
fclose(fid);
运行结果如下:
通过时域波形和频谱图对比可以看出,解调信号与原信号相差不大。解调算法可行。
2.modelsim仿真
将MATLAB仿真出来的已经降频的I、Q两路信号导入文本文件中,作为modelsim仿真的输入信号。
quartus新建工程,解调部分Verilog代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module demod (
rst,
clk,
Sn,
im,
qm
);
input rst , clk;
input signed [15:0]im,qm;
reg signed[15:0]Im,Qm;
output [15:0]Sn;
reg signed[32:0] Sn;
always @ (posedge clk ) begin
if(rst) begin //清零
Im<=0;
Qm<=0;
end
else begin
Im<=im; //延时一个单位
Qm<=qm; //qm(n)=Qm(n-1)
Sn <= Qm * im - qm * Im ; //解调信号
end
end
endmodule
textbench部分代码(省略端口连接等部分代码):
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
initial
begin
clk=0;
//设置复位信号
rst=1;
#2 rst =0 ;
end
always
begin
#2 clk=~clk;
end
//从外部TX文件读入数据作为测试激励
integer Pattern;
reg signed [15:0] stimulusQ[1:data_num];
reg signed [15:0] stimulusI[1:data_num];
initial
begin
//文件必须放置在"工程目录simulationmodelsim"路径下
$readmemb("Qm.txt",stimulusQ );
$readmemb("Im.txt",stimulusI );//读入2进制数据
Pattern=0;
repeat(data_num) //读入128000个数据
begin
Pattern=Pattern+1;
qm=stimulusQ[Pattern-1];
im=stimulusI[Pattern-1];
#4;
end
$stop ; //停止读取数据
end
//将解调信号数据Sn写入外部TXT文件中(Sn.txt)
integer file_Sn;
initial
begin
//文件放置在"工程目录simulationmodelsim"路径下
file_Sn = $fopen("Sn.txt");
end
always @(posedge clk)
$fdisplay(file_Sn,"%d",Sn);
endmodule
modelsim仿真波形:
matlab读取modelsim仿真的解调信号数据并分析:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
clear all
clc
ps = 625000; %数据率625KHz
a = 1000; %数据长度
Fs = 80*10^6; %采样率
dt = 1/Fs;
t = 0:dt:(a*Fs/ps-1)/Fs;
%%%%%%%%%读取modelsim仿真的解调信号数据%%%%%%%%%%
fid=fopen('E:FMquartussimulationmodelsimSn.txt','r');
[s,N]=fscanf(fid,'%lg',inf);
N=N-1;
fclose(fid);
sn=s/max(abs(s));
%%%%%%%%%%%%%%%%%%低通滤波%%%%%%%%%%%%%%%%%%%%
% Flp1=2*10^5; %滤波器截止频率
% a=fir1(200,Flp1/Fs,'low'); %设计滤波器
% figure(4);
% stem(b); %滤波器单位脉冲响应
% sn=filter(a,1,sn);
%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%
figure(1);
subplot(211);plot(t,sn);title('解调信号时域');
subplot(212);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(sn)))));
title('解调信号频域');
低通滤波前的解调信号如图:
从频谱图可以看出信号的高频噪声很多,信噪比低。
再加上低通滤波器后的解调信号如图:
通过低通滤波器以后,高频噪声被去除,信噪比变高。此时与原信号的波形图和频谱图基本一致。
最后
以上就是俊逸盼望最近收集整理的关于FM调制解调的全部内容,更多相关FM调制解调内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复