用matlab产生一个频率为1Hz,振幅为1的余弦信源,设载波频率为10Hz,A=2.想干解调器输入信噪比为15dB
主程序:
%AM调制
fc=10;
f0=1;
A=2;
t0=5;%如果频率为1,那至少要信号时长5个周期
snr=15;
dt=0.003;
fs=1/dt;
B=2;
df=0.0003;
t=0:dt:t0;
Lt=length(t);
snr_lin=10^(snr/10);
figure(1);
subplot(321)%调制信号波形
m1=cos(2*pi*f0*t);
plot(t,m1(1:length(t)))
R=2*max(m1);
axis([0 t0 -R/2 R/2])
ylabel('调制信号');
subplot(322)%调制信号频谱
[M1,m1,df1,f]=T2F(m1,dt,df,fs);
plot(f,fftshift(abs(M1)));
axis([-2 2 0 3]);
xlabel('f');
ylabel('调制信号频谱');
subplot(323)%载波波形
m2=cos(2*pi*fc*t);
plot(t,m2(1:length(t)));
ylabel('载波信号波形');
axis([0 0.4 -R/2 R/2])
subplot(324);%载波频谱
[M2,m2,df1,f]=T2F(m2,dt,df,fs);
plot(f,fftshift(abs(M2)));
xlabel('f');
ylabel('载波信号频谱');
axis([-20 20 0 3])
subplot(325)%已调波波形
m=(m1(1:length(t))+A).*m2(1:length(t));
plot(t,m(1:length(t)));
R=2*max(m)+A;
axis([0 3 -R/2 R/2])
ylabel('已调信号波形');
subplot(326)
[M,m,df1,f]=T2F(m,dt,df,fs);
plot(f,fftshift(abs(M)));
ylabel('已调信号频谱');
xlabel('f');
axis([-15 15 0 3])
%将已调信号送入信道
signal_power=power_x(m(1:Lt));
noise_power=(signal_power*fs)/(snr_lin*2*B);
noise_std=sqrt(noise_power);
noise=noise_std*randn(1,Lt);
figure(2);
subplot(321)%噪声波形
plot(t,noise)
axis([0 5 -10 10]);
xlabel('t');
ylabel('噪声信号');
subplot(322)%噪声信号频谱
[noisef,noise,df1,f]=T2F(noise,dt,df,fs);
plot(f,fftshift(abs(noisef)));
axis([-50 50 0 1])
xlabel('f');
ylabel('噪声信号频谱');
subplot(323)%信道中的信号
sam=m(1:Lt)+noise(1:Lt);
plot(t,sam);
axis([0 1 -R R])
xlabel('t');
ylabel('信道中的信号');
subplot(324)%信道中信号的频谱
[samf,sam,df1,f]=T2F(sam,dt,df,fs);
plot(f,fftshift(abs(samf)));
axis([-17 17 0 6]);
ylabel('信道中信号的频谱');
xlabel('f');
subplot(326)%带通滤波器
f_start=fc-B;
f_cutoff=fc+B;
[H ,f]=bp_f(length(sam),f_start,f_cutoff,df1,fs,A);
plot(f,fftshift(abs(H)));
axis([-15 15 0 2.5 ])
xlabel('f');
ylabel('带通滤波器');
%经过带通滤波器
DEM=H.*samf;
[dem]=F2T(DEM,fs);
figure(3)
subplot(321)
plot(t,dem(1:Lt))
axis([0 3 -5 5])
xlabel('t')
ylabel('理想BPF输出信号');
[demf,dem,df1,f]=T2F(dem(1:Lt),dt,df,fs);
subplot(322)%经过理想带通滤波器后信号频谱
plot(f,fftshift(abs(demf)));
xlabel('f');
ylabel('理想BPF输出信号频谱');
axis([-15 15 0 5]);
%与本地载波相乘,混频
subplot(323)%本地载波
plot(t,m2(1:Lt));
axis([0 0.4 -2 2])
xlabel('t');
ylabel('本地载波');
subplot(324)%本地载波频谱
plot(f,fftshift(abs(M2)));
xlabel('f');
ylabel('载波信号频谱');
axis([-20 20 0 3])
der=dem(1:Lt).*m2(1:Lt);%混频
subplot(325);
plot(t,der);
xlabel('t');
ylabel('混频后的信号');
axis([0 3 -1 R]);
subplot(326)%混频后信号频谱
[derf,der,df1,f]=T2F(der,dt,df,fs);
plot(f,fftshift(abs(derf)))
xlabel('f');
ylabel('混频后信号频谱');
axis([-30 30 0 7])
%经过低通滤波器
figure(4)
[LPF, f]=lp_f(length(der),B,df1,fs,2);
subplot(322)
plot(f,fftshift(abs(LPF)))
xlabel('f')
ylabel('理想LPF')
axis([-3 3 0 3])
DM=LPF.*derf;
[dm]=F2T(DM,fs);
subplot(323)
plot(t,dm(1:Lt));
xlabel('t')
ylabel('LPF输出信号')
subplot(324)
[dmf,dm,df1,f]=T2F(dm(1:Lt),dt,df,fs);
plot(f,fftshift(dmf));
xlabel('f')
ylabel('LPF输出信号频谱')
axis([-3 3 0 8])
%去除解调信号中的直流分量
dmd=dm(1:Lt)-mean(dm(1:Lt));
subplot(325)
plot(t,dmd)
axis([0 t0 -R/2 R/2])
xlabel('t')
ylabel('恢复信号')
[dmdf,dmd,df1,f]=T2F(dmd,dt,df,fs);
subplot(326)
plot(f,fftshift(dmdf));
xlabel('f')
ylabel('恢复信号的频谱')
axis([-1.5 1.5 0 3])
subplot(321)
plot(t,m1(1:Lt));
axis([0 ,5,-4,4])
xlabel('t')
ylabel('调制信号')
子程序:
T2F.m
function[M,m,df1,f]=T2F(m,ts,df,fs)
[M,m,df1]=fftseq(m,ts,df);
f=[0:df1:df1*(length(m)-1)]-fs/2;
M=M/fs;
Fftseq:
function [M,m,df]=fftseq(m,ts,df)
fs=1/ts;
if nargin==2
n1=0;
else
n1=fs/df;
end
n2=length(m);
n=2^(max(nextpow2(n1),nextpow2(n2)));
M=fft(m,n);
m=[m,zeros(1,n-n2)];
df=fs/n;
F2T.m
function[m]=F2T(M,fs)
m=real(ifft(M))*fs;
sigalband:
function[Bw_eq]=signalband(sf,df,T)
sf_max=max(abs(sf));
Bw_eq=sum(abs(sf)).^2*df/T/sf_max.^2;
Power_x:
function p=power_x(x)
p=(norm(x).^2)/length(x);
lp_f.m
function [H,f]=lp_f(n,f_cutoff,df1,fs,p)
n_cutoff=floor(f_cutoff/df1);
f=[0:df1:df1*(n-1)]-fs/2;
H=zeros(size(f));
H(1:n_cutoff)=p*ones(1,n_cutoff);
H(length(f)-n_cutoff+1:length(f))=p*ones(1,n_cutoff);
bp_f.m
function[H,f]=bp_f(n,f_start,f_cutoff,df1,fs,p)
n_cutoff=floor(f_cutoff/df1);
n_start=floor(f_start/df1)
f=[0:df1:df1*(n-1)]-fs/2;
H=zeros(size(f));
H((n_start+1):n_cutoff)=p*ones(1,n_cutoff-n_start);
H(length(f)-n_cutoff+1:length(f)-n_start)=p*ones(1,n_cutoff-n_start);
(待改进。。。。。。。。)