如何在MATLAB中控制ifft输出的长度和采样时间?

如何在MATLAB中控制ifft输出的长度和采样时间?,matlab,signal-processing,fft,ifft,Matlab,Signal Processing,Fft,Ifft,我的频域数据如下所示: 这意味着我有一个向量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函数的输出长度始终

我的频域数据如下所示:

这意味着我有一个向量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)/信号长度)可以在采样频率中指定

编辑: 请在您的答案中包含如何实现您的想法的MATLAB代码。我已经有了如何做到这一点的概念,但我无法让实际的实现工作。 我特别想问的是,ifft函数的输入参数是什么:

y = ifft(input_arg);
我正在寻找MATLAB代码,如何在已知(f,Y,采样频率,信号长度)的情况下创建输入参数

以下是我的实现,它没有按预期工作:

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));

如果您知道采样率和持续时间,那么很容易计算点数,N:

N = duration (seconds) * sample_rate (Hz)

在频域中需要相同数量的点N。如果你有更少的,那么你可以用零填充。频域中每个料仓表示的频率等于
i/sample_rate
,其中
i
是料仓编号,
0我将通过执行以下步骤使其简单灵活:

  • ifft
  • 计算目标采样率除以起始采样率
  • 使用“rat”命令获取将获得目标采样率的上采样/下采样数
  • 使用“重采样”命令对数据进行重采样
  • 如果您只需要一定数量的数据,只需删掉其中的一部分即可。如果您需要更多数据,请按照Paul的建议,在对数据进行ifft'T'之前用零填充数据

  • 有各种各样的潜在问题和方法来提高效率。例如,您可以在频域中进行重采样。不过,首先,我会保持简单并学习您的方法。

    如果您希望原始向量元素K的ifft最终以采样率SR在长度为N的向量中产生正弦频率F:

    使用比例因子(F*N)/(SR*K)对原始向量进行插值或重采样

    对于非整数比例因子,请使用镜像Sinc插值内核以获得良好的结果

    零点填充或继续插值(取决于插值内核的宽度)以生成长度为N/2的向量。如果插值产生大于N/2或小于0的有效面元值,则折叠并添加它们

    将实向量转换为复向量(“对于“偶数”正弦结果,虚”元素均为零)

    围绕N/2镜像N/2长度向量,以生成长度为N的共轭对称向量,并除以2.0的比例因子

    或者,乘以一个比例因子,该比例因子是IFFT中内置的比例因子的倒数(1,N,sqrt(N),等等)


    IFFT()。

    在我看来,您似乎完全忽略了最终采样率的问题。@Jim:“最终采样率”是由上面的
    sample\u rate
    确定的。是的,但您只能使用该方法以数量极其有限的采样率为目标。不过,我不应该说“完全忽略”,所以我对此表示歉意。@Jim:好吧,我不知道你为什么认为这是一个有限的采样率,除非你假设FFT只能有2次方大小?@Rambaldi:正如Jim所说,我认为你现在已经掌握了所有需要的信息——自己在MATLAB中实现它将有助于巩固你头脑中的概念,这比其他人为你完成所有工作要好得多。我希望ifft是最后一步。ifft的输出应该是具有指定长度和采样频率的时域信号。@Rambaldi然后需要在频域进行重采样。为什么ifft必须是最后一步?好的,在时域中重新采样是可以接受的。但是如何实现Y对称并用零填充它呢?我不是在寻找一个概念,而是实际的MATLAB代码。所以当你说用零填充时,你会如何实现它?@Rambaldi无意冒犯,但我不喜欢人们要求我为他们做所有的工作。我们为你指明了正确的方向。自己动手,遇到问题时问问题。这听起来很有希望。但我不知道如何在matlab中使用镜像sinc插值内核。你能给我指一下正确的方向吗?在我的实现(附在我的原始问题之后)中,您可以看到频域内的插值完全改变了ifft函数的输出。这是为什么?如何避免?