欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用MATLAB进行模拟实现AM调制解调技术

最编程 2024-08-14 14:38:26
...
【直播预告】上云 vs 下云:降本增笑?割韭菜?

用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);

 

 

 





(待改进。。。。。。。。)

 

 

 

                                    

推荐阅读