最近看到网上很多人在做基本的数字信号调制解调仿真时候用到了T2F/F2T/lpf.m这三个流传甚广的函数,这三个函数在信号解调部分组成了一个抽样判决前的低通滤波器,以前我也直接调用过,但是今天打开函数一看,还是发现了点问题,先看看T2F函数:

1. T2F.m

function [f,sf]= T2F(t,st)
%Input is the time and the signal vectors,the length of time must greater
%than 2
%Output is the frequency and the signal spectrum
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);

T2F.m其实就是计算输入序列的FFT,输入参数为时间序列t和信号序列st,返回值为频率序列f和对应的幅值sf。函数先计算了时间采样间隔dt,然后将时间序列t的最后一位(截至时刻)赋值给了T,接着定义频率采样间隔df=1/T,采样点数N,然后进行N点的fft变换→定义频率序列→调用fftshift。

正常来说,大部分人编写信号,时间序列的起始为0时刻,这样的话T=t(end)=(N-1)dt。这种情况下该函数在定义频率采样间隔时:df=1/T=1/(N-1)/dt.很明显该结果是错误的,因为采样频率fs=1/dt,df=fs/N=1/N/dt。

这样会使得当设计的信号采样点数减小的情况下,计算的频谱产生很大的偏差。(但是如果输入信号时间序列的起始为dt时刻的话,调用该函数是正确的,但这种情况应该比较少吧)

将该函数稍作修改就能用啦,如下(fftshift前面的系数没什么用我就删了):

function [f,sf]= T2F1(t,st)
%需满足时刻起始点为0
%Input is the time and the signal vectors,the length of time must greater
%than 2
%Output is the frequency and the signal spectrum
dt = t(2)-t(1);
T=t(end);
df = 1/(T+dt);
N = length(st);
f=-N/2*df : df : N/2*df-df;
sf = fft(st);
sf = fftshift(sf);

2. lpf.m

function [t,st]=lpf(f,sf,B)
%This function filter an input data using a lowpass filter
%Inputs: f: frequency samples
% sf: input data spectrum samples
% B: lowpass bandwidth with a rectangle lowpass
%Outputs: t: time samples
% st: output data time samples
df = f(2)-f(1);
T = 1/df;
hf = zeros(1,length(f));
bf = [-floor( B/df ): floor( B/df )] + floor( length(f)/2 );
hf(bf)=1;
yf=hf.*sf;
[t,st]=F2T(f,yf);
st = real(st);

接着看lpf.m函数,调用这个函数要输入参数为频率序列f,对应的幅值sf,矩形低通滤波器截至频率B。采样频率间隔df,然后计算T(显然也有问题,但是该赋值后续并没有使用,因此不管它),hf为长度与f相同的全零序列,而bf显然是想计算f中对应低通频段的位置。我们知道f中第位表示的是直流(f=0),那么bf的表达式里少加了一个1。而且floor是向下取整,我们应该改为fix,即向0取整。最后一行取实部也应该不必要,如果原始的时间序列是实的,那么st也是实序列。

修改后的函数如下:

function [t,st]=lpf1(f,sf,B)
%This function filter an input data using a lowpass filter
%Inputs: f: frequency samples
% sf: input data spectrum samples
% B: lowpass bandwidth with a rectangle lowpass
%Outputs: t: time samples
% st: output data time samples
df = f(2)-f(1);
T = 1/df;
hf = zeros(1,length(f));
bf = [-fix( B/df ): fix( B/df )] + floor( length(f)/2 )+1;
hf(bf)=1;
yf=hf.*sf;
[t,st]=F2T1(f,yf);
st = real(st);

3.F2T

function [t,st]=F2T(f,sf)
%This function calculate the time signal using ifft function for the input
df = f(2)-f(1);
Fmx = ( f(end)-f(1) +df);
dt = 1/Fmx;
N = length(sf);
T = dt*N;
t = 0:dt:T-dt;
sff = fftshift(sf);
st = Fmx*ifft(sff);

F2T.m函数就是计算信号的IFFT,基本没什么问题,Fmx算的就是采样频率,写得这么奇怪应该是别人修改后的版本,而且时间序列的表达式在这又是明显正确的,也稍微改一下,一样把ifft前面的系数删去,如下:

function [t,st]=F2T1(f,sf)
%This function calculate the time signal using ifft function for the input
df = f(2)-f(1);
N = length(sf);
Fmx = N*df;%采样频率
dt = 1/Fmx;%采样间隔
T = dt*N;
t = 0:dt:T-dt;
sff = fftshift(sf);
st = ifft(sff);

原始的三个函数在信号序列采样点数较大时对解调影响较小,亲测PSK和FSK能正确解调,但是当采样点数只有几十个时,解调误码率很高,因为组成的低通滤波器的频带完全错位和扩宽了,以上修改后的函数亲测能运行且正确解调。

最后再补充一句,调用现成的函数时一定一定一定要注意适用条件,能瞅一眼就都瞅一眼,以免后续产生各种问题。

Matlab里关于T2F/F2T/lpf.m函数调用应注意的问题及函数修改相关推荐

  1. matlab子函数调用变量,matlab中,怎么样用function自定义函数调用另一个函数名为输入?...

    点击查看matlab中,怎么样用function自定义函数调用另一个函数名为输入?具体信息 答:test定义两个参数,一个是函数,一个是函数的变量. function [z]=test11(funna ...

  2. 用matlab自己搭建bp神经网络,怎样在matlab里建立一个BP神经网络模型?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用以下的数据怎样在matlab里建立一个BP神经网络模型?求高手帮忙!!最好是有详细步骤以及代码 年份 WTI(美元/桶) 2007-1 54.26 20 ...

  3. semilogx 多条曲线_怎么让两个指数在一个坐标,matlab里怎样一个坐标上显示多个曲线,而且横轴要用指数形式的?谢谢...

    Q1:matlab里怎样一个坐标上显示多个曲线,而且横轴要用指数形式的?谢谢 多个纵轴数组分别是y1,y2,y3,横轴数组为x 命令为: semilogx(x,y1,x,y2,x,y3) 完了 Q2: ...

  4. matlab里面板有什么作用,MATLAB轻松享受GPU的强大功能

    MATLAB轻松享受GPU的强大功能 MATLAB的GPU支持为活跃于许多学科的大量研究人员(不一定是CUDA编程专家)提供了一种加速科学计算的新方法.考虑到MATLAB主要是用于科学计算和工程计算, ...

  5. 用matlab跑神经网络模型,怎样在matlab里建立一个BP神经网络模型?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用以下的数据怎样在matlab里建立一个BP神经网络模型?求高手帮忙!!最好是有详细步骤以及代码 年份 WTI(美元/桶) 2007-1 54.26 20 ...

  6. 怎样用matlab模型建立,怎样在matlab里建立一个BP神经网络模型?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用以下的数据怎样在matlab里建立一个BP神经网络模型?求高手帮忙!!最好是有详细步骤以及代码 年份 WTI(美元/桶) 2007-1 54.26 20 ...

  7. Matlab里evalin和assignin的用法

    原文地址:Matlab里evalin和assignin的用法作者:了凡春秋 assignin与evalin     MATLAB通常的基本工作空间是'base'空间.MATLAB在程序运行过程中,将为 ...

  8. matlab里插入行和列

    matlab里插入行和列 >> A=magic(4) A =     16     2     3    13      5    11    10     8      9     7 ...

  9. MATLAB里面的filter和filtfilt的C语言源代码

    MATLAB里面的filter和filtfilt的C语言源代码 嗯,算法非常简单,就是网上搜不到C代码实现.filter是个很万能的数字滤波器函数,只要有滤波器的差分方程系数,IIR呀FIR呀都能通过 ...

最新文章

  1. iPhone开发:Objective-c中@property声明时的参数释疑
  2. Python3-join()和split()的用法
  3. mysql数据库连接javaweb_javaweb中mysql数据库连接方法
  4. js中类型识别的方法
  5. 搞懂Java分布式锁实现看这篇文章就对了
  6. 分享Silverlight/WPF/Windows Phone一周学习导读(06月13日-06月18日)
  7. linux 核显驱动程序,支持下代核显 Intel放出Linux图形驱动
  8. Homebrew 插件自启动
  9. 安装mysql-server之后,root用户不能登录问题
  10. JavaEE 保存文件获取绝对路径getResource()和servletContext.getRealPath(/)
  11. 在LaTeX中使用Python highlighting in LaTeX让python代码高亮
  12. PTA-航空公司VIP客户查询
  13. js中utf8和中文互转的方法
  14. 直播间搭建实现iOS直播聊天消息界面
  15. Netron 可视化
  16. SAS学习笔记5:删除字符串空格-left/right/trim/strip/compress/compbl等函数的比较
  17. 逐单分析分时图指标(转贴)
  18. 国外人气最旺的软件测试网站
  19. 创建可启动 WinPE 介质|使用 DISM 修改 Windows 映像
  20. 小年到了,用 Python 实现一场环保无污染的烟花秀,祝大家节日快乐

热门文章

  1. 抓取全网财经新闻,计算新闻相关股票的多空舆情,量化买入
  2. Go语言编程笔记16:存储数据
  3. 第527篇-Prism学习系列3_Modularity
  4. VL02N货物移动报错:消息号M7093 “对于移动类型643和账户XXX业务范围(033)的不同字段选择“
  5. 那些吸引眼球的微信标题你会么?
  6. codeforces1146G Zoning Restrictions
  7. 二进制和十进制怎么互转
  8. 趣闲赚~~~~~~青龙脚本
  9. 【_ 面試 】在单点登录中,如果 cookie 被禁用了怎么办?
  10. Python暴力破解教程: Zip加密文件, pdf加密书籍在线爆破!