2015-04-24 1 views
0

У меня есть функция, которая в основном воссоздает команду freqz в matlab. Я выяснил, как построить всю трансформацию моего частотного отклика, но мне нужно только половину его, и мне нужно нормализовать его от pi до 1 (где 0: pi представляет мою ось x, и я хочу, чтобы это 0: 1). Код здесь:Matlab Восстанавливая freqz, нормализуя ось x и получая половину графика

function freqrespplot(b, a) 

hb = fft(b,512); 
ha = fft(a,512); 

magh = (abs(hb) ./ abs(ha)); 
angh = angle(hb ./ ha); 

x = linspace(0,2*pi, 512); 

subplot(2,1,1); 
plot(x,magh,'g'); 
subplot(2,1,2); 
plot(x,angh,'r'); 

end 

В примере б = [1 2 2], а = [0 1 0,8], участки, такие как следующие:

freqrespplot ([1 2 2], [0 1 .8]); Магнитуда Correct total Magnitude, want 0 to pi normalized 0 to 1

и мой соответствующий фазовый участок Want phase 0 to pi and normalized 0 to 1

Я хочу, чтобы ось х (омега), чтобы перейти от 0 до 1, в обоих случаях, и соответствуют 0 до пи, принимая только половину граф, как это возможно, если:

Desired Output

+0

Что случилось с replotting самого с помощью пользовательских й координат осей и кадрирования у-данных ? – krisdestruction

+0

Пожалуйста, также разместите образцы входных данных или пример игрушки, чтобы помочь воссоздать ваши сюжеты. – krisdestruction

+0

Я не уверен, как получить нормированную ось x: 0 по оси x, без изменения размера графика (округляя его горизонтально вдоль оси). То, что я хотел бы сделать, - это посмотреть только 0 на pi текущего изображения и установить его на нормированной оси. Образцы входных данных размещены, спасибо за это хедз-ап! – MikaelCMiller

ответ

1

Вам нужно только некоторые небольшие изменения, отмеченные с комментариями в коде ниже:

function freqrespplot(b, a) 

hb = fft(b,512); 
ha = fft(a,512); 

magh = (abs(hb) ./ abs(ha)); 
angh = angle(hb ./ ha); 

x = linspace(0,2, 513); %// 2, not 2*pi. And 513. Last value will be discarded 
x = x(1:end-1); %// discard last value to avoid having 0 and 2*pi (they are the same) 

subplot(2,1,1); 
plot(x(1:end/2),magh(1:end/2),'g'); %// plot only half 
subplot(2,1,2); 
plot(x(1:end/2),angh(1:end/2),'r'); %// plot only half 

end 

С вашим примером b и a это производит

enter image description here

Вы можете включить один дополнительный образец для достижения правого края графика. Я комментирую только различие с выше кодом:

function freqrespplot(b, a) 

hb = fft(b,512); 
ha = fft(a,512); 

magh = (abs(hb) ./ abs(ha)); 
angh = angle(hb ./ ha); 

x = linspace(0,2, 513); 
x = x(1:end-1); 

subplot(2,1,1); 
plot(x(1:end/2+1),magh(1:end/2+1),'g'); %// plot only lower half plus one value 
subplot(2,1,2); 
plot(x(1:end/2+1),angh(1:end/2+1),'r'); %// plot only lower half plus one value 

end 

Сравните полученный график (правая часть):

enter image description here

+1

Во-первых, спасибо, что так хорошо объяснили! Теперь я вижу, что на самом деле это было связано только с форматированием оси. Является ли причина перехода от 0 до 2 в linspace, потому что это способ нормализации фигуры? – MikaelCMiller

+0

Я думаю, что моя самая большая проблема с matlab в целом привыкает к использованию векторов, поэтому я вижу, что это тоже переводится в эту функцию. Я должен буду провести дополнительное исследование, чтобы исправить это. – MikaelCMiller

+1

@Mikael_SFSU См. Edit: Я добавил вторую версию, включая один дополнительный образец, чтобы график достиг вертикальной линии при x = 1. И да, вы в основном используете 'linspace' от 0 до 2, так что значение половины равно 1, а не pi –

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