الطيف المحوسب باستخدام Matlab FFT لا يعطي نتيجة متسقة لأطوال مختلفة من العينة (نفس عدد النقاط ولكن Fs مختلفة)؟

2

أود أن أرسم لمحة عن الخشونة (من قياسات AFM) ولكن لا يزال هناك هذا الأمر الذي أسيء فهمه بخصوص FFT (خاصة في وثائق Matlab).

أريد مقارنة قياسين ، يُعرفان أيضًا بملف تعريف للوقاحة. تم إجراؤها على نفس السطح ، إلا أنها اختلفت فقط على حقيقة أن أحدهما مصنوع على طول أقصر من الآخر. لكل ملف تعريف ، لدي نفس عدد مقاييس العينة (N = 512 هنا). لنفترض أن هذه هي ملفاتي الشخصية ، t10 و t100 هو الخراج الذي يتم إجراء القياس عليه ، و d10 و d100 كونها الإحداثيات الرأسية ، ak ارتفاع القياس في ملف تعريف الخشونة.

N=512;
t10 = linspace(0,10, N);
t100= linspace(0,100, N);
d10  = sin(2*pi*0.23 .*t10)+cos(2*pi*12 .*t10);
d100 = sin(2*pi*0.23 .*t100)+cos(2*pi*12 .*t100);

نظرًا لأنه نفس السطح الذي أقيسه ولكن مع استبانة مكانية مختلفة ، أي فترة أخذ عينات مختلفة ، يجب أن يتداخل طيف السعة أحادي الجانب لملامح التعرق هذه ، أليس كذلك؟

على عكس ما يجب أن أحصل عليه ، لدي الرسوم البيانية التالية: Imagen 8127 و Imagen 8128

باستخدام الوظيفة التالية:

function [f,P1,S1] = FFT_PowerSpectrumDensity(time,signal,flagfig)
H=signal;
X=time;
ell=length(X);
L = ell;% 2^(nextpow2(ell)-1) % Next power of 2 from length of the signal
deltaTime = mean(diff(X));
Fs=1/deltaTime; %% mean sampling frequency

%% Compute the Fourier transform of the signal.
Y = fft(H);
%% Compute the two-sided spectrum P2. Then compute the single-sided spectrum P1 based on P2 and the even-valued signal length L.
P2 = abs(Y/L); % abs(fft(signal Y)) / Length_of_signal
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
if flagfig~=0
    figure(flagfig)
    loglog(f,P1)
    title('Single-Sided Amplitude Spectrum of X(t)','FontSize',18)
    xlabel('Spatial frequency f=1/\lambda (m^{-1})','FontSize',14)
    ylabel('|P1(f)| (m)','FontSize',14)
end

S = (Y.*conj(Y)).*(2/L).^2; % power spectral density

S1 = S(1:L/2+1);
S1(2:end-1) = S1(2:end-1);
%% Power spectrum (amplitude = a^2+b^2), in length^2
if flagfig~=0
    figure(flagfig+1)
    loglog(f,S1)
    title('Power spectrum','FontSize',18)
    xlabel('Spatial frequency f=1/\lambda (m^{-1})','FontSize',14)
    ylabel('(Y*2/L)^2 (m^2)','FontSize',14)
end
end

أسمي هذه الوظيفة على سبيل المثال باستخدام الأمر التالي:

[f10, S10]= FFT_PowerSpectrumDensity(t10, d10, 10);

هل ينبغي أن أستخدم L=2^pow2(ell)-1) ؟؟؟ فهمت أنه يوفر مدخلات أفضل لوظيفة FFT؟ أيضًا ، أنا غير متأكد تمامًا بشأن معظم الوحدات والقيم التي يجب أن أجدها.

شكرا لمساعدتكم وتصحيحاتكم واقتراحاتكم.

1 إجابة

1
افضل جواب

مشكلتك في إشارة الإدخال الخاصة بك:

N=512;
t100 = linspace(0,100, N);
d100 = sin(2*pi*0.23 .*t100)+cos(2*pi*12 .*t100);

d100 لا تستند إلى عينات. عندك cos(0) في عينة قبضتك ، ثم cos(2*pi*12*0.1953 = cos(2*pi*2.3436) في عينتك الثانية. أي 2.3 فترات لاحقة!

التخطيط d100 و d10 معًا ، والتكبير في أول 10 ثوانٍ من الإشارة ، يكشف المشكلة:

Imagen 693158

وبالتالي ، يتم تقدير مكون التردد المنخفض بشكل صحيح (الذروة الواسعة لـ d10 يرجع إلى فترات قليلة وليس عددًا صحيحًا منها) ، ولكن مكون التردد الأعلى ، الذي تم تسميته باسم d100 ، يظهر بتردد أقل.

راجع للشغل: فيما يتعلق بتغيير طول التحويل إلى قوة من اثنين: سيؤدي ذلك إلى تسريع الحساب بشكل عام ، ولكن في هذه الحالة لديك بالفعل قوة من إشارة طولية. لن تكون النتائج أفضل ، إنها تتعلق بسرعة الحساب فقط.

:مؤلف
فوق
قائمة طعام