Реализация функции с использованием циклов for и умножения матриц в matlab - PullRequest
1 голос
/ 05 марта 2020

Моя цель - реализовать функцию, которая выполняет синтез Фурье в Matlab как часть изучения языка. Функция реализует следующее выражение:

y = sum(ak*exp((i*2*pi*k*t)/T)

, где k - индекс, ak - вектор коэффициентов Фурье, t - вектор времени выбранных времен, а T - период сигнала.

Я пробовал что-то вроде этого:

for counter = -N:1:N
    k = y+N+1;
    y(k) = ak(k)*exp((i*2*pi*k*t)/T);
        % y is a vector of length 2N+1
end

Однако, это дает мне ошибку, что стороны не имеют одинаковое количество предметов внутри них. Это имеет смысл для меня, поскольку t - вектор произвольной длины, и поэтому я пытаюсь сделать y (k) равным множеству вещей, а не одной вещи. Вместо этого я подозреваю, что мне нужно попробовать что-то вроде:

for counter = -N:1:N
    k=y+N+1;
    for t = 0:1/fs:1
        %sum over t elements for exponential operation
    end
    %sum over k elements to generate y(k)
end

Тем не менее, я предположительно могу реализовать это с помощью чисто матричного умножения. Как я мог это сделать? Я пытался обернуть голову вокруг того, что делает Matlab, но, честно говоря, это так далеко от других языков, которые я знаю, что у меня нет никакого представления о том, что делает Matlab под капотом. Понимание того, как переключаться между операциями над матрицами и операциями в циклах for, было бы чрезвычайно полезным.

1 Ответ

0 голосов
/ 05 марта 2020

Вы можете использовать kron для достижения своей цели без for петель, т. Е. Матричного представления:

y = a*exp(1j*2*pi*kron(k.',t)/T);

, где a, k и t все предполагаются как строки -векторы

Пример

N = 3;
k = -N:N;
t = 1:0.5:5;
T = 15;
a = 1:2*N+1;
y = a*exp(1j*2*pi*kron(k.',t)/T);

такой, что

y =

 Columns 1 through 6:

   19.1335 +  9.4924i   10.4721 + 10.6861i    2.0447 +  8.9911i   -4.0000 +  5.1962i   -6.4721 +  0.7265i   -5.4611 -  2.8856i

 Columns 7 through 9:

   -2.1893 -  4.5489i    1.5279 -  3.9757i    4.0000 -  1.7321i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...