أي قواعد من الإبهام كيفية تنعيم طيف FFT لمنع القطع الأثرية عند هدفين اليدين؟

StackOverflow https://stackoverflow.com/questions/3827346

  •  26-09-2019
  •  | 
  •  

سؤال

لقد حصلت على طيف حجم FFT وأريد إنشاء مرشح منه يمرر بشكل انتقائي مصادر ضوضاء دورية (على سبيل المثال توتنهام Sinewave) و Zero خارج صناديق التردد المرتبطة بضوضاء الخلفية العشوائية. أفهم أن التحولات الحادة في مجال FREQ ستنشئ قطعًا من الرنين بمجرد أن يعود هذا المرشح إلى المجال الزمني ... ولذا فإنني أتساءل عما إذا كان هناك أي قواعد من كيفية تنعيم التحولات في مثل هذا المرشح لتجنب هذا رنين.

على سبيل المثال ، إذا كان لدى FFT صناديق تردد 1M ، وكانت هناك خمسة توتنهام تخرج من أرضية ضوضاء الخلفية ، فأنا أرغب في صفر جميع الصناديق باستثناء صندوق الذروة المرتبط بكل سبيرز الخمسة. والسؤال هو كيفية التعامل مع صناديق التحفيز المجاورة لمنع القطع الأثرية في المجال الزمني. على سبيل المثال ، هل يجب ضبط الصندوق على كل جانب من سلة الحافز على سعة 50 ٪؟ هل يجب استخدام صناديق اثنين على جانبي صندوق Spur (الأقرب بنسبة 50 ٪ ، والأقرب التالي بنسبة 25 ٪ ، وما إلى ذلك)؟ أي أفكار موضع تقدير كبير. شكرًا!

هل كانت مفيدة؟

المحلول

أنا أحب الطريقة التالية:

  • قم بإنشاء طيف الحجم المثالي (تذكر أن تجعله متناظرًا حول العاصمة)
  • التحول العكسي إلى المجال الزمني
  • قم بتدوير الكتلة بمقدار نصف الكتل
  • ضع نافذة هان

أجد أنه يخلق نتائج مجال التردد السلس بشكل معقول ، على الرغم من أنني لم أجربها مطلقًا على شيء حاد كما تقترح. ربما يمكنك عمل مرشح أكثر حدة باستخدام نافذة Kaiser-Bessel ، ولكن عليك اختيار المعلمات بشكل مناسب. من خلال SARPER ، أظن أنه ربما يمكنك تقليل SIDELOBES بمقدار 6 ديسيبل أو نحو ذلك.

إليك بعض كود Matlab/Octave. لاختبار النتائج ، استخدمت freqz(h, 1, length(h)*10);.

function [ht, htrot, htwin] = ArbBandPass(N, freqs)
%# N = desired filter length
%# freqs = array of frequencies, normalized by pi, to turn into passbands
%# returns raw, rotated, and rotated+windowed coeffs in time domain

if any(freqs >= 1) || any(freqs <= 0)
    error('0 < passband frequency < 1.0 required to fit within (DC,pi)')
end

hf = zeros(N,1); %# magnitude spectrum from DC to 2*pi is intialized to 0
%# In Matlabs FFT, idx 1 -> DC, idx 2 -> bin 1, idx N/2 -> Fs/2 - 1, idx N/2 + 1 -> Fs/2, idx N -> bin -1
idxs = round(freqs * N/2)+1; %# indeces of passband freqs between DC and pi
hf(idxs) = 1; %# set desired positive frequencies to 1
hf(N - (idxs-2)) = 1; %# make sure 2-sided spectrum is symmetric, guarantees real filter coeffs in time domain
ht = ifft(hf); %# this will have a small imaginary part due to numerical error
if any(abs(imag(ht)) > 2*eps(max(abs(real(ht)))))
    warning('Imaginary part of time domain signal surprisingly large - is the spectrum symmetric?')
end
ht = real(ht); %# discard tiny imag part from numerical error
htrot = [ht((N/2 + 1):end) ; ht(1:(N/2))]; %# circularly rotate time domain block by N/2 points
win = hann(N, 'periodic'); %# might want to use a window with a flatter mainlobe
htwin = htrot .* win;
htwin = htwin .* (N/sum(win)); %# normalize peak amplitude by compensating for width of window lineshape
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top