2015-11-08 3 views
3

У меня есть это назначение MATLAB. Мне нужно сделать, и до сих пор я создал смешанный сигнал, состоящий из косинусных функций трех значений частот: 86 Гц, 159 Гц и 392 Гц. Я использовал частоту дискретизации 1 кГц и генерировал данные за одну секунду. Затем я создал дискретное преобразование Фурье этого кода, которое показало (что я считаю целью FT). Наиболее часто встречающиеся частоты в составном сигнале. Код и сгенерированные графики для этого показаны ниже:Поиск частотной характеристики полосового фильтра

fs = 1000; 
t = (0 : 1/fs : 1)'; 
f = [ 86, 159, 392 ]; 
x = sum(cos(2*pi * t * f), 2); 
y = fft(x); 
subplot(2,1,1), plot(t,x); 
subplot(2,1,2), stem(y,t); 

(Ради целесообразности я опущу код оси сюжетных и названия). Вот две цифры, которые я создал до сих пор для отчета.

Mixed frequency signal and its DFT

Следующая часть доклада спрашивает меня об этом:

«Если мы будем рассматривать только среднюю частоту интереса найти частотную характеристику системы LTI, которая отфильтровывает более высокие и более низкие частоты используя преобразование Фурье "

Мне нужно знать, есть ли способ, который можно сделать автоматически в MATLAB. Я не знаю, как создать этот полосовой фильтр, а затем найти его частотную характеристику вручную, поэтому мне было интересно, будет ли какой-то способ MATLAB делать это автоматически, поскольку я могу переусердствовать.

ответ

1

Посредством «средней» частоты я предполагаю, что вы хотите отфильтровать сигнал так, чтобы присутствовал только компонент с частотой 159 Гц. Это означает, что выходной результат должен содержать только одну синусоиду при 159 Гц. Во-первых, я хотел бы упомянуть, что преобразование Фурье показывает частотную разложение вашего сигнала. Вы можете представить сигнал как суммирование многих синусоид на разных частотах, и они, возможно, не соответствуют фазе с различными фазовыми сдвигами. Для каждой синусоиды на частоте имеется величина и фаза . Величина подсказывает вам, насколько велика синусоида на этой частоте, и фаза говорит вам, сколько задержки, которое испытывает синусоида.

Теперь, при вычислении БПФ, он выполняет алгоритм Cooley-Tukey, который является очень эффективным способом вычисления преобразования Фурье. Он вычисляется таким образом, что первая половина сигнала показывает спектр от 0 <= f < fn, а вторая половина сигнала показывает спектр от -fn <= f < 0. fn - это то, что известно как Nyquist frequency, что составляет половину частоты дискретизации. Обратите внимание на исключительность в диапазоне первой половины спектра по сравнению со второй половиной. Мы не включают fn в первом тайме, но мы включаем -fn во втором тайме.

Это относится только к действительным сигналам, что является вашим случаем с тремя синусоидальными суммированными вместе. Чтобы сделать это немного более значимым, вы можете использовать fftshift, чтобы вы реорганизовали спектр, так что частота 0 Гц/DC появляется посередине, что позволит вам построить график так, чтобы он находился между -fn <= f < fn.

Кроме того, способ построения сигнала нормализован, что означает, что вы видите частоты на самом деле между -1 <= f <= 1.Для того, чтобы перевести это на реальные частоты, можно использовать следующее соотношение:

freq = i * fs/N 

i является номер бен или точка на FFT вы хотите, в вашем случае составляет от 0 до 500. Помните, что первая половина сигнала представляет собой распределение частот от 0 до fn и от 0 до 500 в сигнале - это то, что вам нужно. Отрицательные частоты можно найти, просто заменив i на -i. fs - частота дискретизации, а N - это размер БПФ, который в вашем случае является общей длиной сигнала, 1001. Для генерации правильных частот, соответствующих точкам справа, вы можете использовать linspace и генерировать N+1 точек между -fn и fn для обеспечения правильности интервала, но поскольку мы не включают fn в положительном конце, мы удаляем это с конца диапазона.

Кроме того, для построения величины и фазы сигнала используйте abs и angle соответственно.

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

%// Your code 
fs = 1000; 
t = (0 : 1/fs : 1)'; 
f = [ 86, 159, 392 ]; 
x = sum(cos(2*pi * t * f), 2); 
y = fft(x); 

%// New code 
%// Shift spectrum 
ys = fftshift(y); 
N = numel(x); %// Determine number of points 
mag = abs(ys); %// Magnitude 
pha = angle(ys); %// Phase 

%// Generate frequencies 
freq = linspace(-fs/2, fs/2, N+1); 
freq(end) = []; 

%// Draw stuff 
figure; 
subplot(2,1,1); 
plot(freq, mag); 
xlabel('Frequency (Hz)'); 
ylabel('Magnitude'); 

subplot(2,1,2); 
plot(freq, pha); 
xlabel('Frequency (Hz)'); 
ylabel('Phase (radians)'); 

Вот что я получаю:

enter image description here

Как вы можете видеть, есть три пики, которые соответствуют трем синусоидальных компонентов. Вы хотите средний, и это на 159 Гц. Чтобы создать полосовой фильтр, вы хотите отфильтровать все компоненты, кроме тех, которые находятся на +/- 159 Гц. Если вы хотите сделать это автоматически, вы найдете места расположения бункеров, которые ближе всего к +/- 159 Гц, а затем разверните окрестности, которые окружают эти две точки, и убедитесь, что они не тронуты, обнуляя остальные компоненты.

Поскольку у вас есть точные синусоиды, использование полосового фильтра в этом отношении вполне приемлемо. В общем, вы не делаете этого из-за эффектов звонка и сглаживания, поскольку резкость отсечки от полосового фильтра таким образом вводит нежелательные эффекты сглаживания во временной области. См. Wikipedia article on aliasing for more details.

Таким образом, чтобы выяснить, где нам нужно отфильтровать, попробуйте использовать min и найти абсолютную разницу между генерируемыми частотами выше 159 Гц - в частности, найти расположения. После того, как вы найдете их для обоих +159 Гц и -159 Гц, расширить окрестность вокруг этих точек, убедитесь, что они нетронутыми, а остальные точки устанавливаются в 0 в спектре:

[~,min_pt_pos] = min(abs(freq - f(2))); %// Find location where +159 Hz is located 
[~,min_pt_neg] = min(abs(freq + f(2))); %// Find location of where -159 Hz is 

%// Neighbourhood size 
ns = 100; %// Play with this parameter 

%// Filtered signal 
yfilt = zeros(1,numel(y)); 

%// Extract out the positive and negative frequencies centered at 
%// 159 Hz 
yfilt(min_pt_pos-ns/2 : min_pt_pos+ns/2) = ys(min_pt_pos-ns/2 : min_pt_pos+ns/2); 
yfilt(min_pt_neg-ns/2 : min_pt_neg+ns/2) = ys(min_pt_neg-ns/2 : min_pt_neg+ns/2); 

yfilt Теперь содержит отфильтрованный сигнал, который удаляет все компоненты, кроме 159 Гц. Если вы хотите, чтобы показать величину и фазу этого фильтрованного сигнала, мы можем сделать это:

mag2 = abs(yfilt); 
pha2 = phase(yfilt); 
figure; 
subplot(2,1,1); 
plot(freq, mag2); 
xlabel('Frequency (Hz)'); 
ylabel('Magnitude'); 

subplot(2,1,2); 
plot(freq, pha2); 
xlabel('Frequency (Hz)'); 
ylabel('Phase (radians)'); 

Вот что мы получим:

enter image description here

Как мы ожидаем, есть только одна сильная частота который разлагает этот сигнал, и это составляет 159 Гц.Теперь, чтобы восстановить этот сигнал, вам нужно будет отменить центрирование, которое мы сделали, и вы должны будете использовать ifftshift для этого отфильтрованного результата, а затем сделать обратный через ifft. Вы также можете получить небольшие остаточные мнимые компоненты, поэтому неплохо использовать real для результата.

out = real(ifft(ifftshift(yfilt))); 

Если мы наносим это, мы получим:

plot(t, out); 
xlabel('Time (seconds)'); 
ylabel('Height'); 

enter image description here

Как вы можете видеть, есть синусоида с одной частотой, и это при 159 Гц. Не возражайте против амплитуд. Это просто из-за неточности в том, сколько точек вы выбрали для построения сигнала, и поэтому некоторые точки времени могут не совпадать точно с истинными пиками сигнала. Имейте в виду, что если бы присутствовало более одной синусоиды, будет точка, где будут встречаться пики всех синусоид, и вы получите более высокий пик вместо пика 1, который предлагает одна синусоида. Поскольку амплитуда колеблется от -1 до 1, вы можете быть уверены, что присутствует только одна синусоида. Этого можно избежать, если вы должны выбрать более мелкий размер шага зерна и, следовательно, больше очков в БПФ.


Надеюсь, этого достаточно, чтобы вы начали. Удачи!

+1

Да, спасибо, это дает мне некоторое представление о том, что мне нужно. – burton01

+0

@ burton01 Рад помочь. Удачи! – rayryeng

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