Я пытаюсь принять зашумленный сигнал, преобразовать его в частотную область, применить к нему фильтр низких частот Баттерворта, чтобы удалить высокочастотный шум, затем преобразовать его обратно во временную область и подогнать к синусоиде найти его фазу относительно других сигналов в системе. Я хорошо построил график исходного сигнала, преобразовал его в частотную область и построил график, чтобы подтвердить, что все правильно. Самая высокая величина частоты составляет 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 - это просто величина различных частот, но я не уверен, что информация, предоставленная фильтру, адекватна, чтобы гарантировать, что она фильтрует правильные частоты при построении графика.