2013-12-01 8 views
0

Приглашение разработать программу для оценки сверток. Это необходимо сделать, не используя MATLAB, встроенный в функцию conv. Поэтому, используя преобразование Фурье, умножая две функции вместе, а затем инвертируя Фурье, преобразуя произведение. Преобразование выполняется с помощью прямого интегрирования. Функция trapz рекомендуется для интеграции с этой функцией.Как сделать реальный сюжет похожим на правильный сюжет?

Я был бы благодарен ЛЮБОЙ отзыв о том, как улучшить мой код, пожалуйста, подробно объясните, какие улучшения и ссылки ссылка на то, как они работают.

Учитывая код:

t = -5:.1:5; 
w = pi; 
X = zeros(101,1); 
H = zeros(101,1); 
Y = zeros(101,1); 
y = zeros(101,1); 
if t >= 0 
x = 0; 
h = 0; 
else 
x = exp((-3.*t)+(-1i*w.*t)); 
h = exp((-2*t)+(-1i*w.*t)); 
end 
for k=2:101 
X(k)=trapz(t(1:k),x(1:k)); 
H(k)=trapz(t(1:k),h(1:k)); 
Y = (X.*H)*exp(1i*w.*t); 
y(k) = (1/(2*pi))*trapz(t(1:k),Y(1:k)); 
end 
disp (length(x)) 
disp (length(X)) 
disp (length(Y)) 
disp (length(y)) 
    disp (y) 
    figure(1); 
    subplot(1,2,1),plot(t,real(y));grid on; 

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

The actual plot is this.

The desired plot is this.

Мой главный вопрос: почему мой сюжет не работает?

Вторично: что в этом коде не указано? Что может сделать этот код более эффективным?

+0

Я прокомментировал предварительное распределение для нулевых векторов, и это, похоже, не повлияло на результат, поэтому я не уверен, что тогда бесполезно иметь его там или нет. PS: Если вы вниз, пожалуйста, объясните, почему я могу улучшить качество будущих вопросов. – SolidusVerum

ответ

2

Я не буду делать всю домашнюю работу, но я дам вам несколько подсказок:

Пропустить if t < 0 часть, она не работает. Для вашего экзамена попытайтесь понять, почему. Если вы не можете понять это, прийти с вашим лучшим угадать, и вы могли бы получить объяснение =)

Попробуйте следующие вместо (без петель или if сек необходимы:

x = exp((-3.*t)+(-1i*pi.*t)).*(t>0); 

И то же самое для h . Постарайтесь понять, что .*(t<0) делает в этом контексте

Это один:..?. Y = (X.*H)*exp(1i*w.*t); должен быть вне цикла Почему сделать предположение, и вы можете получить руководство, если вы ошибаетесь

Также Y является матрицей 101x101. Я думаю, вы хотите, чтобы он был 101x1? Вероятно, вам нужно преобразовать один из векторов в выражение, используемое для создания Y. Прежде чем вы это сделаете, вы должны выяснить разницу между ' и .' (важное различие в этом случае).

Вы используете subplot, но только для построения графика. Если вы хотите графиков в том же сюжете, используйте hold on. Если вы хотите, чтобы сюжеты были рядом друг с другом, не забудьте сделать второй.

И зачем использовать w = pi;, когда вы можете просто использовать pi в уравнениях?

+0

Наилучшая догадка: я думаю, что 'if t <0' не работает, потому что он не будет проверять разные значения в виде цикла. '. * (T <0)' будет делать то, что я хочу, потому что он умножает матрицу только на t, когда t больше нуля, делая его как желаемый множитель функции функции. Почему вы положили '. * (T <0)' второй раз? (typo?) Что касается 'Y = (X. * H) * exp (1i * w. * t);' Я думаю, что это должно выйти наружу, потому что это промежуточный арифметический процесс, который изменится, поскольку он вызванный следующей частью кода. Я близко? – SolidusVerum

+0

* Переменная 'w' была выбрана произвольно как pi, ее переменная для легкого управления выходными данными, поэтому мне не нужно проходить ее и заменять отдельно. * Я использую подзаговор в случае, когда Я добавляю еще один график, хотя в настоящее время я ищу, как использовать 'hold on'. – SolidusVerum

+0

Вот проблема, с которой я столкнулся, другой человек сказал мне попробовать make 'x' и' h' следующим образом: > t = 0: .1: 5; > x1 = exp ((- 3. * t); > x2 = нули (1,50); > x = [x2 x1]; Какая цель, но что касается кодирования, это просто требуется так много времени. . '. * (t> 0)' кажется гораздо более эффективным, но синтаксис не работает с остальной частью кода. Не могли бы вы объяснить, что '. * (t> 0) 'выполняет или посылает ссылку на статью, которая делает? – SolidusVerum

Смежные вопросы