【问题标题】:How to control the length and sampling time of the output of ifft in MATLAB?如何在MATLAB中控制ifft输出的长度和采样时间?
【发布时间】:2011-11-23 15:51:26
【问题描述】:

我的频域数据如下所示:

这意味着我有一个向量 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 的时域数据。

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

我正在寻找如何在 (f,Y,sampling_frequency,signal_length) 已知时创建 input_arg 的 MATLAB 代码。

这是我的实现,但没有按预期工作:

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

【问题讨论】:

    标签: matlab signal-processing fft ifft


    【解决方案1】:

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

    N = duration (seconds) * sample_rate (Hz)
    

    您在频域中需要相同数量的点 N。如果你有更少的那么你可以用零填充。频域中每个 bin 表示的频率等于i / sample_rate,其中i 是 bin 编号,0 <= i < N / 2

    请注意,如果您想要在 IFFT 之后获得纯实时域信号,则您的频域数据需要是复共轭对称的。如果您不关心相位,则只需使实部关于 N/2 对称,虚部为零即可。

    【讨论】:

    • 在我看来,您完全忽略了最终采样率的问题。
    • @Jim:“最终采样率”由上面的sample_rate 决定。
    • 是的,但您只能使用该方法定位极其有限的采样率。不过,我不应该说“完全忽略”,所以对此我深表歉意。
    • @Jim:好的——我不知道你为什么认为这是有限数量的采样率,除非你假设 FFT 只能有 2 的幂大小?
    • @Rambaldi:正如 Jim 所说,我认为您现在拥有所需的所有信息 - 与其他人完成所有工作相比,您自己在 MATLAB 中实现它有助于巩固您脑海中的概念给你。
    【解决方案2】:

    我会通过以下步骤保持简单和灵活:

    1. ift
    2. 计算目标采样率除以起始采样率。
    3. 使用“rat”命令获取上采样/下采样数,以获得目标采样率。
    4. 使用“resample”命令重新采样数据。
    5. 如果您只需要一定数量的数据,只需删除其中的一些即可。如果您需要更多数据,请按照 Paul 的建议在处理数据之前用零填充数据。

    有各种各样的潜在问题和方法可以提高效率。例如,您可以在频域中进行重采样。不过,在开始时,我会保持简单并了解您的方法。

    【讨论】:

    • 我希望 ifft 成为最后一步。 ifft 的输出应该是具有指定长度和采样频率的时域信号。
    • @Rambaldi 然后您需要在频域中进行重采样。为什么 ifft 需要成为最后一步?
    • 好的,在时域重新采样是可以接受的。但是如何实现使 Y 对称并用零填充呢?我不是在寻找一个概念,而是在寻找实际的 MATLAB 代码。那么当你说用零填充时,你会如何实现呢?
    • @Rambaldi 无意冒犯,但我不喜欢人们要求我为他们完成所有工作。我们已经为您指明了正确的方向。自己动手,如果遇到问题,请提出问题。
    【解决方案3】:

    如果您希望原始向量元素 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()。

    【讨论】:

    • 这听起来很有希望。但我不知道如何在 matlab 中使用镜像 sinc 插值内核。你能指出我正确的方向吗?在我的实现中(附加到我的原始问题),您可以看到频域中的插值完全改变了 ifft 函数的输出。为什么会这样以及如何避免?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2019-12-30
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多