使用 ifft 函数报错:ERROR: MethodError: no method matching plan_bfft(::Matrix{Complex}, ::Int64)
技术分享
发布于 2025-07-10 11:01:57
查看 1过去327天
由于 ifft 函数不支持输入参数类型为 Matrix{Complex} 的抽象类型复数矩阵,导致数据类型不匹配出现报错,需要指明数据类型为 Float64 后再进行运算。
运行以下代码会报错
using TyCommunication
using TyMath
using TyPlot
rng = MT19937ar(1234)
trellis_a = poly2trellis(7, [133 171])
# 20M颊域数据子载波位置
N_CBPS = 52
Nsym = 50
Nsc = 64
r = 0.5
AllScIdx = -32:1:31
NullScIdx = cat(-32:-27,0, 27:31,dims=1)
ScIdx = setdiff(AllScIdx, NullScIdx)
ScIdx = ScIdx + 33*ones(Int, size(ScIdx))
# src 比特生成
data = rand(rng, 0:1, Int64(Nsym*N_CBPS*r))
# MCSO编码
codedout, fstate = convenc(data, trellis_a)
# print(codedout)
# BPSK映射
myBPSK = comm_BPSKModulator(; PhaseOffset=0)
sym = step(myBPSK, codedout)
symR = reshape(sym, (N_CBPS, Nsym))
# scatterplot(sym)
# 额域子就波映射
FreqSym = zeros(Complex,Nsc, Nsym)
FreqSym[ScIdx,:] = symR
FreqSymShift = fftshift(FreqSym, 1)
TdSym = ifft(FreqSymShift, 1)
修改代码
using TyCommunication
using TyMath
using TyPlot
rng = MT19937ar(1234)
trellis_a = poly2trellis(7, [133 171])
# 20M颊域数据子载波位置
N_CBPS = 52
Nsym = 50
Nsc = 64
r = 0.5
AllScIdx = -32:1:31
NullScIdx = cat(-32:-27,0, 27:31,dims=1)
ScIdx = setdiff(AllScIdx, NullScIdx)
ScIdx = ScIdx + 33*ones(Int, size(ScIdx))
# src 比特生成
data = rand(rng, 0:1, Int64(Nsym*N_CBPS*r))
# MCSO编码
codedout, fstate = convenc(data, trellis_a)
# print(codedout)
# BPSK映射
myBPSK = comm_BPSKModulator(; PhaseOffset=0)
sym = step(myBPSK, codedout)
symR = reshape(sym, (N_CBPS, Nsym))
# scatterplot(sym)
# 额域子就波映射
# FreqSym = zeros(Complex,Nsc, Nsym) #定义的数据类型为抽象复数矩阵,会导致报错
FreqSym = zeros(ComplexF64,Nsc, Nsym) #指明数据类型为 Float64
FreqSym[ScIdx,:] = symR
FreqSymShift = fftshift(FreqSym, 1)
TdSym = ifft(FreqSymShift, 1)
运行上述代码,可以看到得到了正确结果:

所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境