Inverse FFT for Signal Components
4 ビュー (過去 30 日間)
古いコメントを表示
I have a signal with 2 known frequencies present and I wish to extract and graph each frequency as its own signal. I have put the data through an FFT and have tried to create manual bandpasses to gate the FFT and take the real components of the IFFT of each gate as their individual components of the signals. I have gotten some odd results when putting the "new" data through an IFFT and I don't know how else to finish this script for the most accurate results?
% origin = Signal Data, Data(:,1) = Time
[j,~] = size(origin); NFFT = 2^nextpow2(j);
Fs = 1/(data(2,1)-data(1,1)); Fn = Fs/2;
FTD = fft(origin - mean(origin),NFFT)/j;
Fv(:,1) = linspace(0, 1, NFFT/2-1)*Fn;
Iv(:,1) = 1:numel(Fv); Y = abs(FTD(Iv))*2;
% For f1 = 1.2MHz, f2 = 2.4MHz
H = 3.2; [~,c] = min(abs(Fv(:,1)-(H)));
d = 1.7; [~,b] = min(abs(Fv(:,1)-(d)));
L = 0.5; [~,a] = min(abs(Fv(:,1)-(L)));
BP1 = zeros(length(Fv),1); BP1(b:c,1) = 1; new1 = Y.*BP1;
BP2 = zeros(length(Fv),1); BP2(a:b,1) = 1; new2 = Y.*BP2;
0 件のコメント
回答 (1 件)
Star Strider
2022 年 11 月 11 日
If you just want to filter two frequencies from your signal, either use two bandpass calls (for best results, use the 'ImpulseResponse','iir' name-value pair) or (if the signal is long enough) fir1 to design a FIR filter that will filter both at the same time (however the result will be a signal with those two frequencies, not the individual frequencies). You can use a FIR filter with the fftfilt function, however the two separate (parallel) bandpass calls are likely to give the result you want.
2 件のコメント
Star Strider
2022 年 11 月 15 日
It will be necessary to change the code, especially if the code you’re using isn’t doing what you want it to do.
If you want to do basic frequency domain filtering (that I do not recommend), try something like this —
Fs = 500;
Fn = Fs/2;
L = 9001;
s = randn(1, L);
t = linspace(0, L-1, L)/Fs;
FTs = fft(s)/L;
FTss = fftshift(FTs);
Fv = linspace(-1, 1, L)*Fn;
figure
plot(Fv, abs(FTs))
grid
xlabel('Frequency')
ylabel('Magnitude')
FilterFreq = (Fv <= -99) & (Fv >= -100) | (Fv >= 99) & (Fv <= 100); % Symmetrical Passbands
FTss_filtered = FTss; % Create Filtered Frequency Vector
FTss_filtered(~FilterFreq) = 0; % Set Frequency Components Outside Of The Passband To Zero
figure
plot(Fv, abs(FTss_filtered))
grid
xlabel('Frequency')
ylabel('Magnitude')
title('Filtered Signal')
FTss_filtered = ifftshift(FTss_filtered);
s_filtered = ifft(FTss_filtered);
figure
plot(t, s_filtered)
grid
xlabel('Time')
ylabel('Amplitude')
peridx = islocalmax(s_filtered);
t_peak = t(peridx);
s_filt_freq = 1/mean(diff(t_peak))
figure
plot(t, s_filtered)
grid
xlabel('Time')
ylabel('Amplitude')
xlim([1.9 2.1])
Filtering in the time domain is much more straightforward in concept and simply easier in practise.
.
参考
カテゴリ
Help Center および File Exchange で Frequency Transformations についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!