Как применить фильтр низких частот Баттерворта в частотной области и построить новую частоту - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь принять зашумленный сигнал, преобразовать его в частотную область, применить к нему фильтр низких частот Баттерворта, чтобы удалить высокочастотный шум, затем преобразовать его обратно во временную область и подогнать к синусоиде найти его фазу относительно других сигналов в системе. Я хорошо построил график исходного сигнала, преобразовал его в частотную область и построил график, чтобы подтвердить, что все правильно. Самая высокая величина частоты составляет 300 кГц, как и должно быть, и есть много других шумов, в основном меньших величин.

Однако у меня были проблемы с попыткой отфильтровать этот шум. Мне сказали попробовать использовать фильтр Баттерворта 1-го порядка, поскольку это частично, чтобы увидеть, как различные фильтры будут сравниваться с конечными результатами.

freq = 300000; % 300KHz frequency
fs = 1/ 0.0000000004;  % Sampling Frequency
T = 1/fs;    % Sampling period
L = 1000000; % Length of Signal (amount of points in a column)

wave2 = csvread(' ... ') % File location of noisy signal, just returns a
                         % matrix with time in one column and several
                         % waveform values in the others

wave2_real = wave2(:, [1,2]); % Real Component of Wave 2 vs Time
freq2_real = fft(wave2_real(:,2)); % Frequency domain of wave2_real

P2_2_real = abs(freq2_real / L);
P1_2_real = P2_2_real(1:L/2+1);
P1_2_real(2:end-1) = 2*P1_2_real(2:end-1);
f = fs*(0:(L/2))/L;

% Above four lines are just taken from documentation code

semilogy(f,P1_2_real) % log plot of frequency

[b,a] = butter(1, (freq) / (fs/2)); % 1st order butterworth lowpass filter,
                                    % Wn = 300KHz / (2.5GHz / 2)

freq2_real_filt = filtfilt(b, a, freq2_real);
P2_2_real_filt = abs(freq2_real_filt / L);
P1_2_real_filt = P2_2_real_filt(1:L/2+1);
P1_2_real_filt(2:end-1) = 2*P1_2_real_filt(2:end-1);

semilogy(f, P1_2_real_filt) % log plot

Хотя нефильтрованный частотный график имеет четкий пик при 300 кГц, этого нельзя сказать о фильтрованном графике. Он имеет значительный всплеск на частоте 2500 Гц (я думаю, что это просто округление, поскольку деления по оси х составляют 2500 Гц на деление). Однако высокочастотный шум уменьшается.

Я почти уверен, что моя проблема где-то в строке

freq2_real_filt = filtfilt(b, a, freq2_real);

Тем более, что freq2_real, являясь просто fft сигнала, имеет сложные компоненты.

Я попытался применить фильтрфильтр к P2_2_real (часть, которая была построена для freq2_real), но не дал лучших результатов. Я не уверен, нужно ли мне как-то больше информации, поскольку P2_2_real - это просто величина различных частот, но я не уверен, что информация, предоставленная фильтру, адекватна, чтобы гарантировать, что она фильтрует правильные частоты при построении графика.

...