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

Matlab编写包含坐标变换的傅里叶变换与反变换函数 Matlab里的傅里叶变换与傅里叶反变换傅里叶变换傅里叶变换函数傅里叶反变换傅里叶反变换函数 傅里叶变换 傅里叶变换函数 T2F是一个傅里叶变换函数,输入时间样本t与幅度样本st,输出频域频率样本f以及幅频特性sf。 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); 注意: sf是一个复数,所以输出的 阅读详情
AI摘要

本文针对网络上广泛使用的T2F/F2T/lpf.m三个信号处理函数进行了深入分析,指出了这些函数在不同场景下存在的问题,并给出了修改建议。通过修正这些问题,可以提高信号解调的准确性。

最近看到网上很多人在做基本的数字信号调制解调仿真时候用到了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中第\frac{N}{2}+1位表示的是直流(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实现正弦信号y=cos(1/4*pi*t)波形及频谱,画图、对每一行代码进行标注并完成实验报告。 1.实验代码 为实现正弦信号的波形和频谱,可通过编写傅里叶变换和傅里叶反变换的matlab函数,即编写其子程序,有“t2f.m”和“f2t.m”和task.m文件,详细编写如下所示。 新建matlab函数t2f.m文件 %傅里叶变换子程序 function X=t2f(x) global dt df N t f T; %定义全局... 阅读详情

相关推荐

FPGA 数字信道化 50%重叠设计:32信道 100MHz采样率 Matlab/Verilog 双平台验证

本文详细介绍了FPGA数字信道化50%重叠设计的实现方法,通过32信道100MHz采样率的Matlab/Verilog双平台验证,展示了该技术在宽带信号实时处理中的高效性。重点分析了50%重叠信道化的原理、优势及实现细节,包括资源优化、无缝频谱覆盖等关键技术,为工程师提供了从理论到实践的完整解决方案。

weixin_34413103的博客 340

编程文件_t2f.m_famousqbb_公式_

傅里叶变换,从时域转换到频域,使用傅里叶变换公式

Cortex-M4定点DSP实战:GDFLIB库IIR与移动平均滤波器实现详解

数字信号处理(DSP)是嵌入式实时控制系统的核心技术,尤其在资源受限的微控制器(MCU)上,定点数运算因其高效性成为关键技术。其原理是将浮点小数通过固定的缩放因子转换为整数进行处理,利用CPU高效的整数乘加指令,显著提升计算速度并降低内存占用。这项技术的核心价值在于,它使得在无硬件浮点单元(FPU)的ARM Cortex-M4等MCU上实现复杂的实时信号处理成为可能,广泛应用于电机控制、电源管理和工业传感等对实时性与成本敏感的场景。然而,定点DSP也面临动态范围受限和量化误差两大挑战,处理不当会导致数据溢出

anvt77205的博客 389

T2F.zip_MATLAB t2f函数_MATLAB中T2F函数_matlab t2f_matlab T2F_t2f函数调用

傅里叶变换 MATLAB 函数调用 如实现功率谱分析

【MATLAB】通信信号调制通用函数 — 傅里叶变换

目录傅里叶变换

Fanjufei的博客 1725

用MATLAB计算PLL传输函数:LPF参数与环路稳定性分析

在控制系统设计与信号处理中,传递函数是描述线性时不变系统输入输出关系的核心工具,广泛应用于滤波器设计、反馈环路分析和稳定性判定。锁相环(PLL)作为频率合成、时钟恢复等场景的关键模块,其动态行为可由开环与闭环传递函数完整刻画,而环路滤波器(LPF)的零极点配置直接决定PLL的带宽、相位裕度和锁定性能。借助MATLAB的控制系统工具箱,可快速构建包含鉴相器增益、LPF传递函数和VCO积分项的线性模型,计算开环幅频特性、相位裕度和闭环阶跃响应,有效评估环路稳定性。无论是设计特定带宽的三阶电荷泵PLL,还是调试模

weixin_33226548的博客 61

T2F函数,在matlab中做傅里叶变换时调用

T2F函数,在matlab中做傅里叶变换时调用,时间域信号转化为频率域

PLL传输函数计算:四阶LPF如何悄悄吃掉相位裕度

锁相环(PLL)是频率合成与时钟恢复的核心系统,其稳定性与噪声性能由开环传递函数和闭环传递函数共同决定,其中相位裕度是衡量环路稳定性的关键指标。在工程中,为了抑制参考杂散,常引入四阶LPF(环路滤波器),但高阶极点会引入额外的相位滞后,导致相位裕度下降,甚至引发环路失稳。借助MATLAB脚本与Simulink模型,可以快速计算开环/闭环传递函数、绘制伯德图并校准相位裕度,还能分别评估参考噪声、VCO噪声和LPF噪声的传递路径。这种基于传递函数的定量分析,是通信与FPGA工程师调试PLL环路滤波器、优化相位噪

weixin_27017211的博客 177

matlab 采样开关,数字电源控制器应该怎样去设计?

环路建模工具■环路建模工具就是matlab,通常的做法是建立M文件,然后在M文件中 输入各个模块的传递函数,利用matlab进行相乘(串联),连续转离 散,离散转离散等操作,得到高级环路模型。高级环路模型是指将环路简化为几个基本模块后的结构,这些结构能被 matlab工具箱sisotool所支持。下图为sisotool支持的所有结构:DSP设计工具■DSP参数确定可以使用matlab自带的siso...

weixin_42491621的博客 998

二进制数字调制与MATLAB仿真:2ASK/2FSK/2PSK从原理到误码率曲线

数字调制是通信系统的核心环节,它将二进制比特映射到高频载波的幅度、频率或相位上,从而适应带通信道传输。2ASK、2FSK、2PSK是最基础的三种二进制调制方式,分别通过载波的通断、频率切换和相位跳变来传递信息,而它们的抗噪声性能与带宽效率也各不相同。在工程实践中,MATLAB仿真常被用于验证调制算法的误码率性能,搭建从随机比特生成、NRZ波形扩展、载波调制到AWGN信道加噪、相干解调、低通滤波与抽样判决的完整链路,并与理论误码率曲线对比。实际仿真中有大量容易出错的细节,比如信噪比与Eb/N0的换算、FIR滤

weixin_34408624的博客 334

MATLAB实现2FSK调制解调与误码率仿真

2FSK(二进制频移键控)是数字通信中最基础的频谱调制方式之一,其核心原理是通过两个离散载频映射二进制符号,属于非线性恒包络调制。理解其调制解调机制,需掌握载频偏移、码速率、采样率、信噪比等关键参数的协同关系,以及相干解调中本地载波同步、带通滤波、低通滤波与抽样判决的技术实现逻辑。MATLAB凭借`dmod`/`ddemod`函数族、`awgn`信道建模和`eyediagram`可视化能力,为2FSK系统提供了可验证、可复现的数字仿真沙盒,广泛应用于通信原理教学、LoRa/NB-IoT接收机预研及FPGA原

weixin_29165465的博客 243

DSB调制解调MATLAB仿真资源

DSB调制解调MATLAB仿真资源 【下载地址】DSB调制解调MATLAB仿真资源 DSB调制解调MATLAB仿真资源本资源提供了使用MATLAB对DSB(双边带调制)的调制与解调进行仿真模拟的完整代码和相关图像 项目地址: ht...

gitblog_09763的博客 710

基于MATLAB GUI的2ASK相干解调误码率仿真与实现

数字调制是通信系统的核心环节,误码率仿真则是衡量调制性能的重要手段。在加性高斯白噪声信道下,通过蒙特卡洛方法模拟信号传输过程,能够直观对比理论误码率与仿真结果。2ASK作为最基本的幅度调制方式,其相干解调链路包含载波恢复、低通滤波与抽样判决等关键步骤,对理解数字通信原理具有基础性价值。基于MATLAB GUI搭建的交互式仿真平台,可动态调整信噪比、载波频率等参数,实时观察波形与误码率变化,适用于课程设计、实验教学及工程验证。本文以2ASK误码率仿真为例,详细解析调制解调模型、理论公式与工程代码实现,并给出参

weixin_32715349的博客 302

电荷泵锁相环(CPPLL)相位噪声建模与环路参数设计 MATLAB 仿真系统解析

锁相环PLL相位噪声仿真代码,汇总,教程phase noise1.文件夹里面各个文件作用(包括参考书PLL PHASE NOISE ANALYSIS、lee的射频微电子、以及前人留下的matlab文件还有一份前人留下的 大概的PLL相位噪声仿真过程)2.展示各个模块的各种类型噪声处于环路中的位置以及其传递函数。3.各个模块的相噪仿真方法(VCO仿相位噪声) 4.给出如何从cadence中导入数据至matlab(.CSV文件)5.给出matlab相位噪声建模程序。

jFWTpMJfJjq的博客 440

matlab仿真中的T2F函数

matlab仿真中的T2F函数用于实现频谱的仿真

T2f函数调用

这段代码调用了一个名为T2F的函数,matlab工具箱没用,需要自己拷贝到matlab中,然后调用即可

斩波运放噪声仿真实战:分项建模与1/f抑制量化分析

运算放大器噪声是精密模拟电路设计的核心瓶颈,尤其在微伏级传感器信号调理中,1/f噪声与热噪声的耦合效应常导致实测信噪比远低于理论预期。其本质在于噪声功率谱密度(PSD)需在频域积分求RMS值,而非点频叠加;而斩波技术并非消除1/f噪声,而是通过调制将其搬移至高频后滤除。本文聚焦LTspice中可追溯、可关闭的分项噪声建模方法——涵盖电压/电流噪声、电阻热噪声、PCB寄生及斩波边带,并结合ULF/LF/HF三段频域积分策略,实现对0.1Hz~100kHz噪声贡献的工程级量化归因。适用于生物电信号采集、高分辨率

weixin_34184561的博客 316

matlab 傅里叶变换 t2f

matlab 仿真 傅里叶变换 t2f函数

上一篇: Matlab中IFFT/FFT注意事项及在OFDM仿真中的应用问题
SaintLeeYa
博客等级 码龄8年 995粉丝 2原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值