幅度调制的包络检波解调(求MATLAB代码
发布网友
发布时间:2022-05-25 04:37
我来回答
共2个回答
热心网友
时间:2024-04-01 18:28
用希尔伯特变换可以实现包络检波!
clear all; close all;
t=0:200;
x1=sin(8*pi*t/100)+1;
subplot(411);plot(t,x1);title('信号');
x2=4*sin(40*pi*t/100);
subplot(412);plot(t,x2);title('载波');
x3=(1+x1).*x2;
subplot(413);plot(t,x3);title('调幅信号');
x4=abs(hilbert(x3));
subplot(414);plot(t,x4);title('解调信号');追问这个方法我也会。。。我想要二极管的包络检波
热心网友
时间:2024-04-01 18:29
检波函数如下:
function pout=envelop(pin,varargin)
k=1;
switch numel(varargin)
case 0
k=1;
case 1
k=varargin{1};
if ~isscalar(k),
error '比例系数必须是标量'
return;
end
otherwise
error 'too many params';
return;
end
ph=hilbert(pin);
pout=k*abs(ph);
函数可以有一个或两个参数。第一个参数是必须的,即输入信号序列。第二个参数是可选的,为比例系数。
使用方法示例:
t=0:255;
x1=sin(8*pi*t/100)+1;
x2=4*sin(40*pi*t/100);
x3=x1.*x2;
x4=envelop(x3);
x4即为检波后的信号。基带信号需叠加直流分量使其非负(AM调幅信号),不然不能正确检波。输出的图形我就不贴上来了,因为我的网络已经“欠费停机”了,本文是用Windows Live Writer写成后利用每天仅有5分钟的公共网络服务上传的。
如果有人因为某些原因必须自己亲手实现希尔伯特变换,那么可用如下的方法:
pin为输入序列,pout为输出序列:
pw=fft(pin);
n=numel(pin);
pw(uint32(n/2+1.5):end)=pw(uint32(n/2+1.5):end)*j;
pw(1:uint32(n/2+0.5))=pw(1:uint32(n/2+0.5))*(-j);
ph=real(ifft(pw));
pout=pin+j*ph;
我试了几个序列,与hilbert函数有几乎相同的输出,误差非常小。