Как контролировать длину и время выборки вывода ifft в MATLAB? - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть данные в частотной области, которые выглядят так:

enter image description here

Это означает, что у меня есть вектор 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]

Выполнение обратного преобразования Фурье должно дать синусоидальный сигнал с частотой 5 Гц.

Функция MATLAB ifft может преобразовывать Y и f во временную область. Давайте назовем векторы во временной области y и t. Я ищу способ, как получить данные во временной области с указанной частотой дискретизации и указанной длиной сигнала. Например, мне нужны данные во временной области с длиной сигнала 1 секунда и частотой дискретизации 1000 Гц.

Выход функции ifft MATLABs всегда имеет ту же длину, что и вход, поэтому я не уверен, что дать в качестве входа для получения необходимой частоты дискретизации и длины сигнала.

Подводя итог, я пытаюсь написать функцию MATLAB

[t,y] = custom_ifft(f,Y,sampling_frequency,signal_length)

, который преобразует данные частотной области (f, Y) в данные временной области (t, y), где длина вектора времени t может быть указана в длине сигнала (например, 1 секунда) и частоте дискретизации (длина (y) / signal_length) можно указать с помощью sampling_frequency

EDIT: Пожалуйста, включите в ваш ответ код MATLAB, как реализовать вашу идею. У меня уже есть концепция, как это сделать, но я не могу заставить работать фактическую реализацию. Я специально спрашиваю, что передать в качестве входного аргумента функции ifft:

y = ifft(input_arg);

Я ищу код MATLAB для создания input_arg, когда (f, Y, sampling_frequency, signal_length) известны.

Вот моя реализация, которая не работает должным образом:

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

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

Если вы знаете частоту дискретизации и продолжительность, то легко подсчитать количество точек, N:

N = duration (seconds) * sample_rate (Hz)

Вам нужно такое же количество точек, N, в частотной области. Если у вас меньше, вы можете просто заполнить нулями. Частота, представленная каждым бином в частотной области, равна i / sample_rate, где i - номер бина, а 0 <= i < N / 2.

Обратите внимание, что ваши данные в частотной области должны быть комплексно-сопряженными симметричными, если вы хотите получить сигнал в реальном времени после IFFT. Если вам не важна фаза, просто сделайте симметричную действительную часть относительно N / 2, а мнимую часть равной нулю.

0 голосов
/ 23 ноября 2011

Если вы хотите, чтобы ifft исходного векторного элемента K заканчивал тем, что производил синусоидальную частоту F в векторе длины N при частоте дискретизации SR:

Интерполяция или повторная выборка исходного вектора с использованием масштабного коэффициента: (F * N) / (SR * K)

Для нецелых масштабных коэффициентов используйте зеркальное ядро ​​интерполяции Sinc для получения достойных результатов.

Обнулите или продолжите интерполяцию (в зависимости от ширины ядра интерполяции), чтобы получить вектор длины N / 2. Если интерполяция дает значительные значения бина выше N / 2 или ниже 0, сложите и добавьте их.

Преобразование действительного вектора в комплексный вектор ("мнимые" элементы равны нулю для "четного" синусоидального результата).

Зеркально отразить вектор длины N / 2 вокруг N / 2, чтобы получить сопряженный симметричный вектор длины N, и разделить на коэффициент масштабирования 2,0;

При желании умножьте на коэффициент масштабирования, который является обратным к коэффициенту масштабирования, встроенному в ваш IFFT (1, N, sqrt (N) и т. Д.)

IFFT ().

0 голосов
/ 23 ноября 2011

Я бы сделал это простым и гибким, выполнив следующие шаги:

  1. ifft
  2. Рассчитайте целевую частоту дискретизации, деленную на начальную частоту дискретизации.
  3. Получите числа upsample / downsample, которые позволят вам получить целевую частоту дискретизации, с помощью команды «rat».
  4. Повторите выборку данных с помощью команды «resample».
  5. Если вы хотите только определеннуюколичество данных, просто отрубить некоторые из них.Если вам нужно больше данных, добавьте их в нули, прежде чем добавить их, как предположил Пол.

Существуют всевозможные потенциальные проблемы и способы сделать это более эффективным.Например, вы можете выполнить повторную выборку в частотной области.Однако для начала я бы все упростил и изучил ваш путь.

...