0

我的频域数据如下所示:

在此处输入图像描述

这意味着我有一个向量 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));
4

3 回答 3

2

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

N = duration (seconds) * sample_rate (Hz)

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

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

于 2011-11-23T15:56:28.247 回答
0

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

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

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

于 2011-11-23T16:18:57.080 回答
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()。

于 2011-11-23T17:36:12.977 回答