T = t(end); df = 1 / T; N = length(st); f = -N/2 * df : df : N/2 * df - df; sf = fft(st); sf = T / N * fftshift(sf); %低通滤波 df = f(2) - f(1); fN = length(f); ym = zeros(1, fN); xm = floor((2*fm) / df); xm_shift = [-xm : xm-1] + floor(fN / 2); ym(xm_shift) = 1; yf = ym .* sf; %频域转时域 df = f(2) - f(1); fmax = (f(end) - f(1) + df); dt = 1 / fmax; N = length(f); t = [0 : N-1] * dt; yf = fftshift(yf); st = fmax * ifft(yf); st1 = real(st);
时间: 2023-06-19 21:10:07 浏览: 160
这段代码是对一个时间序列进行低通滤波的过程。首先进行了傅里叶变换,然后将频率轴移动到中心位置,接着构造一个低通滤波器,将低通滤波器和信号的频域表示相乘得到滤波后的频域信号。最后再进行一次傅里叶逆变换,将滤波后的频域信号转换为时域信号。
具体来说,代码的第一行计算了信号的持续时间 T。接着计算了信号的采样频率 df,以及采样点数 N。然后通过傅里叶变换 fft 将信号转换为频域表示,再通过 fftshift 将频域信号移到中心位置。接下来构造了一个低通滤波器,具体方法是将一个长度为 fN 的零向量 ym,将其中心的 2fm 个元素赋值为 1,然后将其移动到中心位置。使用 .* 运算符将低通滤波器和信号的频域表示相乘得到滤波后的频域信号 yf。最后进行一次傅里叶逆变换 ifft,将滤波后的频域信号转换为时域信号 st1。
需要注意的是,代码中使用了一个临时变量 sf 来保存傅里叶变换后的频域信号,因为在后面的计算中需要多次使用到。另外,代码中的 xm_shift 变量用于将低通滤波器移动到正确的位置,使其与频域信号相乘时能够正确地进行过滤。
相关问题
代码介绍function [f,sf]= T2F(t,st) dt = t(2)-t(1); T=t(end); df=1/T; N=length(st); f=-N/2*df:df:N/2*df-df; sf=fft(st); sf=T/N*fftshift(sf);
该代码实现将时域信号转换为频域信号。
输入参数:
- t:时间轴数组
- st:时域信号数组
输出参数:
- f:频率轴数组
- sf:频域信号数组
代码解释:
- dt:采样间隔
- T:采样总时间
- df:频率间隔
- N:采样点数
- f:频率轴数组,由采样点数和频率间隔计算得到
- sf:进行FFT变换得到的频域信号数组,通过fftshift将频域信号移到中心位置,并乘以系数T/N,得到正确的幅度值。
修改代码 i=10;%基带信号码元数 j=5000; t=linspace(0,5,j);%0-5之间产生5000个点行矢量,即将[0,5]分成5000份 f1=10;%载波1频率 f2=5;%载波2频率 fm=i/5;%基带信号频率 码元数是10,而时域长度是5,也就是一个单位2个码元 a=round(rand(1,i));%产生随机序列 %产生基带信号 st1=t; for n=1:10 if a(n)<1 for m=j/i*(n-1)+1:j/i*n st1(m)=0; end else for m=j/i*(n-1)+1:j/i*n st1(m)=1; end end end figure(1); subplot(411); plot(t,st1); title('基带信号st1'); axis([0,5,-1,2]); %基带信号求反 st2=t; for n=1:j if st1(n)==1 st2(n)=0; else st2(n)=1; end end subplot(412); plot(t,st2); title('基带信号反码st2'); axis([0,5,-1,2]); %载波信号 s1=cos(2*pi*f1*t); s2=cos(2*pi*f2*t); subplot(413),plot(s1); title('载波信号s1'); subplot(414),plot(s2); title('载波信号s2'); %调制 F1=st1.*s1;%加入载波1 F2=st2.*s2;%加入载波2 figure(2); subplot(411); plot(t,F1); title('F1=s1*st1'); subplot(412); plot(t,F2); title('F2=s2*st2'); e_fsk=F1+F2; subplot(413); plot(t,e_fsk); title('2FSK信号');%键控法产生的信号在相邻码元之间相位不一定连续 %% %加噪 SNR = 0:0.1:10; % 信噪比范围 error = zeros(1,length(SNR)); % 误码率数组 for i = 1:length(SNR) fsk_noisy = awgn(e_fsk, snr, 'measured'); % 加入噪声 subplot(414); plot(t, fsk_noisy); % 绘制加入噪声后的时域波形 title('受干扰时域波形');
好的,以下是修改后的代码,主要是添加了计算误码率的部分:
```
i=10;%基带信号码元数
j=5000;
t=linspace(0,5,j);%0-5之间产生5000个点行矢量,即将[0,5]分成5000份
f1=10;%载波1频率
f2=5;%载波2频率
fm=i/5;%基带信号频率 码元数是10,而时域长度是5,也就是一个单位2个码元
a=round(rand(1,i));%产生随机序列
%产生基带信号
st1=t;
for n=1:10
if a(n)<1
for m=j/i*(n-1)+1:j/i*n
st1(m)=0;
end
else
for m=j/i*(n-1)+1:j/i*n
st1(m)=1;
end
end
end
figure(1);
subplot(411); plot(t,st1); title('基带信号st1'); axis([0,5,-1,2]);
%基带信号求反
st2=t;
for n=1:j
if st1(n)==1
st2(n)=0;
else
st2(n)=1;
end
end
subplot(412); plot(t,st2); title('基带信号反码st2'); axis([0,5,-1,2]);
%载波信号
s1=cos(2*pi*f1*t);
s2=cos(2*pi*f2*t);
subplot(413),plot(s1); title('载波信号s1');
subplot(414),plot(s2); title('载波信号s2');
%调制
F1=st1.*s1;%加入载波1
F2=st2.*s2;%加入载波2
figure(2);
subplot(411); plot(t,F1); title('F1=s1*st1');
subplot(412); plot(t,F2); title('F2=s2*st2');
e_fsk=F1+F2;
subplot(413); plot(t,e_fsk); title('2FSK信号');%键控法产生的信号在相邻码元之间相位不一定连续
%加噪
SNR = 0:0.1:10; % 信噪比范围
error = zeros(1,length(SNR)); % 误码率数组
for i = 1:length(SNR)
fsk_noisy = awgn(e_fsk, SNR(i), 'measured'); % 加入噪声
subplot(414); plot(t, fsk_noisy); % 绘制加入噪声后的时域波形
title('受干扰时域波形');
%解调
demod1=fsk_noisy.*s1;
demod2=fsk_noisy.*s2;
[b,a]=butter(6,2*fm/j,'low');
df1=filter(b,a,demod1);%低通滤波
df2=filter(b,a,demod2);%低通滤波
z1=df1(j/i/2:j/i:j);
z2=df2(j/i/2:j/i:j);
%判决
for k=1:i
if z1(k)>z2(k)
c(k)=1;
else
c(k)=0;
end
end
%比较
error(i) = sum(c~=a); % 统计误码数
BER(i) = error(i)/i; % 计算误码率
end
%绘制误码率曲线
figure(3);
semilogy(SNR, BER);
xlabel('信噪比(dB)');
ylabel('误码率');
title('2FSK误码率曲线');
```
其中,我们添加了一个 `SNR` 的范围,然后在循环中计算加噪后的误码率。最后,我们使用 `semilogy` 函数绘制了误码率曲线。
希望这可以帮助您!
阅读全文