我的频域数据如下所示:
这意味着我有一个向量Y,它包含向量x中频率点的幅度。例如
f = [0 1 2 3 4 5 6 7 8 9 10]
Y = [0 0 0 0 0 1 0 0 0 0 0]
执行逆傅里叶变换应该给出频率为5Hz的正弦波。
MATLAB函数ifft可以将Y和f转换为时域。让我们在时域y和t中调用向量。我正在寻找一种如何获得具有指定的采样频率和指定信号长度的时域数据的方法。例如,我希望时域数据的信号长度为1秒,采样频率为1000Hz。
MATLABs ifft函数的输出始终与输入的长度相同,所以我不确定要输入什么来获得所需的采样频率和信号长度。
总结一下,我正在尝试编写一个MATLAB函数
[t,y] = custom_ifft(f,Y,sampling_frequency,signal_length)
将频域数据(f,Y)转换为时域数据(t,y),其中时间矢量t的长度可以在信号长度(例如1秒)和采样频率(长度)中指定(y)/ signal_length)可以用sampling_frequency
指定编辑: 请在答案中包含MATLAB代码如何实现您的想法。我已经有了如何做到这一点的概念,但我无法让实际的实现工作。 我特别询问将什么作为ifft函数的输入参数:
y = ifft(input_arg);
我正在寻找MATLAB代码,当(f,Y,sampling_frequency,signal_length)已知时,如何创建input_arg。
这是我的实现无法按预期工作:
Y = [0 zeros(1,100) 1 0 0 zeros(1,500) 0 0 1 zeros(1,100)];
Y_interp = interp1(Y,linspace(1,length(Y),2*length(Y)));
y = ifft(Y) ;
y_interp = ifft(Y_interp);
figure;
plot(y);
figure;
plot(real(y_interp));
figure;
plot(abs(y_interp));
答案 0 :(得分:1)
如果您知道采样率和持续时间,那么很容易计算出点数,N:
N = duration (seconds) * sample_rate (Hz)
在频域中需要相同数量的点N.如果你少了这个,你可以用零填充。频域中每个二进制位表示的频率等于i / sample_rate
,其中i
是二进制数,0 <= i < N / 2
。
请注意,如果在IFFT之后需要纯实时域信号,则频域数据需要是复共轭对称的。如果你不关心相位,那么只需使实部对称关于N / 2和虚部零点。
答案 1 :(得分:0)
通过执行以下步骤,我会保持简单灵活:
有各种各样的潜在问题和方法可以提高效率。例如,您可以在频域中进行重采样。不过,首先,我会保持简单并学习你的方法。
答案 2 :(得分:0)
如果您希望原始矢量元素K的ifft以采样率SR在长度为N的向量中产生正弦频率F:
使用比例因子对原始矢量进行插值或重采样:(F * N)/(SR * K)
对于非整数比例因子,请使用镜像Sinc插值内核获得不错的结果。
零填充或继续插值(取决于插值内核的宽度)以生成长度为N / 2的向量。如果插值产生高于N / 2或低于0的显着bin值,则折叠并添加它们。
将实数向量转换为复数向量(“虚”元素全为零,表示“偶数”正弦结果)。
将N / 2长度向量镜像在N / 2周围以产生长度为N的共轭对称向量,并除以比例因子2.0;
可选地,乘以比例因子,该比例因子是IFFT中建立的比例因子的倒数(1,N,sqrt(N)等)
IFFT()。