Jump to content

    
Sign in to follow this  
Грендайзер

Как задать значения ф-ций

Recommended Posts

Здравствуйте. Начал изучать матлаб и появилось несколько вопросов на которые никак не найду ответов. Вопросы глупые конечно, но практики маловато так что...

1) Имею значения коэффициентов передаточной ф-ции (допустим фильтра), ну и хочу посмотреть его АЧХ, для этого мне надо построить его дискретное преобразование фурье, т.е.

h(n) = h(n0) + h(n1) + ... + h(N-1);

H(jw) = h(0) + h(n1)*exp(-jw) + h(n2)*exp(-2jw) +...+ h(N-1)*exp(-(N-1)jw)

Собственно если коэффициентов h не много всё нормално, но если их количество растёт, то прописывать умножение каждого из них на экспоненту становится нудной задачкой... Вообщем можно это дело как то оптимизировать? Никак не допру... Матлаб ругается, т.к. ему нужно совпадение размера матриц, а круговую частоту w я обычно задаю так w = [1:500]*pi/500 или что то в этом духе, количество же коэффициентов значительно меньше.

2) И ещё, как задать скажем такую ф-цию:

h(n) = sin(n)/n, n /= 0;

h(n) = 1/pi, n = 0;

Пробовал при помощи if, но что то не выходит... :05:

Share this post


Link to post
Share on other sites
для этого мне надо построить его дискретное преобразование фурье

Ага, а еще вам нужна миллиметровка и карандаш :)

coef = tf([1 1],[0.5 1 1]);
bode(coef)

 

2) И ещё, как задать скажем такую ф-цию:

h(n) = sin(n)/n, n /= 0;

h(n) = 1/pi, n = 0;

Пробовал при помощи if, но что то не выходит... :05:

А вы покажите, как вы пробовали, а мы поможем...

Share this post


Link to post
Share on other sites

Ничё се :biggrin:

 

А вы покажите, как вы пробовали, а мы поможем...

 

Вот так:

 

if n == 0

h = w/pi

else

h = sin(w*n)/n*pi

end

 

От так :05:

 

Share this post


Link to post
Share on other sites
Вот так:

 

if n == 0

h = w/pi

else

h = sin(w*n)/n*pi

end

 

От так :05:

Такая запись должна работать для скалярных n. Если у вас n - вектор (MATLAB же), то лучше как-то так:

 

function h = myfun(n)
h = sin(n)./n;
h(n == 0) = 1/pi;

 

А потом можно делать так:

plot(myfun(-2:0.1:2))

Share this post


Link to post
Share on other sites

Ух ты, спасибо за помощь :) Правда с функцией tf не совсем ясно, но надо повнимательней описание почитать...

Edited by Грендайзер

Share this post


Link to post
Share on other sites
Ух ты, спасибо за помощь :) Правда с функцией tf не совсем ясно, но надо повнимательней описание почитать...

Конечно, читайте help, особенно по Control System Toolbox (и примеры в документации) - там все разжевано.

Share this post


Link to post
Share on other sites

Если передаточная ф-я фильтра то можно freqz:

 

freqz Frequency response of digital filter

[H,W] = freqz(B,A,N) returns the N-point complex frequency response

vector H and the N-point frequency vector W in radians/sample of

the filter:

 

jw -jw -jmw

jw B(e) b(1) + b(2)e + .... + b(m+1)e

H(e) = ---- = ------------------------------------

jw -jw -jnw

A(e) a(1) + a(2)e + .... + a(n+1)e

 

given numerator and denominator coefficients in vectors B and A.

 

Share this post


Link to post
Share on other sites
Почитайте книгу Matlab для студента.

Спасибо, обязательно посмотрю :)

Если передаточная ф-я фильтра то можно freqz:

Да, я видел эту функцию, спасибо. Правда меня больше интересовало преобразование Фурье и я как раз нашёл нужную функцию - fft. Если вдруг кому понадобится, вот здесь http://blogs.mathworks.com/steve/2010/06/2...-output-of-fft/ класно расписано с примерами. Правда не допёр как отобразить лишь пол периода преобразования, а не весь период...

 

doc sinc

 

doc sinc - это sin(x)/x ?

Edited by Грендайзер

Share this post


Link to post
Share on other sites
Да, это обычный синк.

Ясно, спасибо. Правда данную ф-цию я привёл скорей как пример, мне просто было интересно как описать ф-цию заданную таким образом...

Share this post


Link to post
Share on other sites

Снова здравствуйте. Продолжаю осваивать Matlab и тут вот столкнулся с такой проблемой. Написал кодик для того, что бы построить АЧХ и ФЧХ:

>> F = 800; Fs = 8000; N = 100; n = 0:N-1;
>> x = cos(2*pi*F*n/Fs); % формируем наш сигнал
>> Ft = fft(x);                  % делаем преобразование фурье
>> % строим графики
>> subplot(2,1,1)
>> stem(n, abs(Ft))          % Строим АЧХ
>> subplot(2,1,2)
>> plot(n, angle(Ft))         % Строим ФЧХ

Так вот с АЧХ всё нормально, но вот ФЧХ - какая то кракозябра (см. рисунок). Из за чего это и как с этим бороться?

post-64451-1473942713_thumb.png

Share this post


Link to post
Share on other sites
Снова здравствуйте. Продолжаю осваивать Matlab и тут вот столкнулся с такой проблемой. Написал кодик для того, что бы построить АЧХ и ФЧХ:

...

Посмотрите это

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this