Дискретные преобразования Фурье

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Дискретное преобразование Фурье (DFT) является эквивалентом преобразования Фурье для дискретных данных. Одномерное дискретное преобразование Фурье элементов данных N L = [L 1, …, L N] задано как список F = [F 1, …, F N], такой что

.

Обратное дискретное преобразование Фурье задано как список L следующих элементов:

.

MuPAD® использует алгоритм быстрого преобразования Фурье (FFT), чтобы вычислить дискретное и обратные дискретные преобразования Фурье. Для любого N вычислительными затратами является O (N  log2 (N)). Чтобы вычислить дискретные преобразования Фурье, используйте следующие функции:

  • numeric::fft, чтобы вычислить преобразование Фурье

  • numeric::invfft, чтобы вычислить обратное преобразование Фурье

Эти функции принимают списки (область вводят DOM_LIST), массивы (область вводят DOM_ARRAY), оборудование массивы с плавающей точкой (область вводят DOM_HFARRAY), и матрицы (категория Cat::Matrix). Принятые структуры данных (за исключением списков) могут быть одной - или многомерный. Можно использовать произвольные арифметические выражения в качестве записей.

Дискретное преобразование Фурье часто используется в обработке сигналов. Это позволяет вам разлагать сигнал на набор периодических сигналов с различными частотами и анализировать те частоты. Предположим, у вас есть дискретное множество значений сигнала, выбранного по фиксированной процентной ставке. Сила сигнала быть периодической, но шум эффективно скрывает период. Например, следующий список data представляет такой сигнал:

f1 := 150: f2 := 300:
data := [sin(f1*2*PI*t/1000) + sin(f2*2*PI*t/1000)
         + 10*(frandom() - 1/2) $t = 0..1000]:

Когда вы отображаете данные на графике, сигнал кажется случайным. Шум эффективно скрывает две основных частоты сигнала:

plot(plot::Listplot(data, t = 0..1000),
		AxesTitles = ["Time", "Amplitude"],
		YAxisTitleOrientation = Vertical,
		XAxisTitleAlignment = Center, YAxisTitleAlignment = Center)

Чтобы доказать, что сигнал имеет сильный периодический компонент и найти основные частоты, вычислите дискретное преобразование Фурье сигнала:

fft := abs(numeric::fft(data)):

График fft показывает четыре peaks. Peaks соответствует двум основным частотам исходного сигнала (f1 = 150 и f2 = 300):

plot(plot::Listplot(fft, f = 0..1000),
	AxesTitles = ["Frequency", "Power"],
	YAxisTitleOrientation = Vertical,
	XAxisTitleAlignment = Center, YAxisTitleAlignment = Center)

numeric::fft и функции numeric::invfft принимают опции. Используйте опцию Symbolic, чтобы предотвратить преобразование ваших данных к числам с плавающей запятой. Например, создайте список следующих точных значений:

exactData := [sin(1/3*2*PI*n/10) $n = 0..3]

Вычислите дискретное преобразование Фурье, сохраняющее данные в его точной символьной форме:

fft := numeric::fft(exactData, Symbolic)

Вычислите обратное дискретное преобразование Фурье получившегося списка. Используйте функцию numeric::invfft с Symbolic, чтобы предотвратить данные от преобразования до значений с плавающей точкой:

numeric::invfft(fft, Symbolic)

Кроме того, можно убрать результаты путем удаления очень маленьких условий. Чтобы отбросить все записи результата с абсолютными значениями, меньшими, чем времена максимальное абсолютное значение всех операндов результата, используйте опцию Clean. Эта опция также удаляет крошечные мнимые условия, которые часто появляются в результате эффектов округления. Например, без опции Symbolic, обратное преобразование Фурье от предыдущего примера возвращает следующий список значений с плавающей точкой:

numeric::invfft(fft)

Когда вы используете опцию Clean, функция numeric::invfft отбрасывает маленькие условия, которые появляются во вторых и четвертых записях получившегося списка:

numeric::invfft(fft, Clean)