0

私はオクターブに小さな問題があります。

何かをシミュレートしたいのでループが必要ですが、残念ながらデータはオクターブ単位で保存されません。この問題を解決するためにいくつかの可能性を試しましたが、解決策が見つかりません。

これは私のファイルのコードです:

%------ input from the user --------
%-----------------------------------

at=1;                  % acq. time in s

nu=300;               % Resonance frequency in Hz

scantime=1.1;          % time for a scan, >at in s

T1=(0.1*at:at/10:120*at)';                 % in s

T2=T1;                      % in s

noisestd=1;                 % noise std

expt = (at+scantime);                % experiment time



%-------RATIOS----------


T2T1ratio=(0.01:0.01:12)';                        %T2T1 ratio


att1ratio=at*1./(T1);                                %acquisition time by T1


%----------CALL CALCSPEC.M--------------
%----------------------------------------



for T1idx = (1:(rows(T1)))'
    for T2T1ratioidx = (1:rows(T2T1ratio))'
        for att1ratioidx = (1:rows(att1ratio))'
            spectrum = [s2n, peakwidth] = calcspec(at,nu,scantime,T1,T2,noisestd,expt);
            m={T1idx,T2T1ratioidx,att1ratioidx,s2n,peakwidth}
        endfor
    endfor
endfor

そして、これは私の.mファイルのコードです:

function [s2n, peakwidth] = calcspec(at,nu,scantime,T1,T2,noisestd,expt);



%---- calculating input vars -----------------
%---------------------------------------------

ns=round(expt/scantime);                % nr. of scans

Fs = 4*nu;                              % Sampling frequency (>=2*nu by Nyquist)

t = ((0:(at*Fs-1))/Fs)';                   % Time vector

fn=2^nextpow2(at*Fs);                   % number of points for the FT (must be power of 2)

res = Fs/fn;                            % spectral resolution (bins in the fft)

freq=0:res:(Fs-res);                    % frequency axis

fid=exp(-i*2*pi*nu.*t).*exp(-t./T2);    % generation of "clean" FID

fid=ns*fid'/max(fid);                   % normalization of FID 

for scan=1:ns
    noisyfid = fid+=noisestd*randn(1,res+1)';       % noisy fid
endfor




% FOURIER TRANSFORM 
% -----------------

sig = fft(fid, fn);                                                   % FT of clean spec

noisysig = fft(noisyfid, fn);                                        % Fourier Transform of noisy spec


%-------Calc S2N ----------
%---------------------

s2n = var(real(sig))/var(real(noisysig));


% DETERMINE FULL WIDTH AT HALF MAXIMUM + INTENSITY
%----------------------------------------------------

peakwidth = fwhm(real(sig));

intensity = max(real(sig));

ご覧のとおり (うまくいけば) データをセル配列に保存しようとしましたが、計算後に s2n と peakwidth の値が 1 つだけ保存されます。

誰かが私が間違ったことを教えてもらえますか?

4

3 に答える 3

0

ループしていますが、ループ内の計算ではインデックスをまったく使用していません。あなたはおそらくそのようなことをする必要があります:

[s2n(%appropriate index%), peakwidth(%appropriate index%)] = calcspec(at,nu,scantime,T1(T2T1ratioidx),T2(T2T1ratioidx),noisestd,expt);
% same applies for m calculation

また、=同じ行に 2 つの標識があり、最終結果がどうなるかはわかりませんが、期待したものではない可能性があります。

spectrum = [s2n, peakwidth] = ...
于 2013-06-24T09:01:49.977 に答える
0

あなたの答えに多くのthx!

=そうしないと、私のオクターブがいくつかの変数が未定義であるというメッセージを私に与えていたので、私が作った2つの兆候はこれを試しました。

今、私は間違っているすべてを変更しようとしましたが、インデックスでそのことをまだ理解していません。T1idx今、私は自分のコードでインデックスを使用しようとしたので、今すぐ取得できます:

    for T1idx = (1:(rows(T1)))
    for T2T1ratioidx = (1:rows(T2T1ratio))
        for att1ratioidx = (1:rows(att1ratio))
            [sig(T1idx),noisysig(T1idx)] = calcspec(at,nu,scantime,T1,T2,noisestd,expt);
            s2n = sig/noisysig;
            peakwidth = fwhm(real(sig));
            m={s2n,peakwidth};
        endfor
    endfor
endfor

しかし今、私はメッセージを受け取ります:A(I) = X: X must have the same size as Iそして、「より良い」インデックスを取得する良い考えがありません......

最後に、次の構造のセル配列を取得したいだけです。

T1idx   T2T1ratioidx   att1ratioidx       s2n         peakwidth
1          1                1          a value         a value
2          .                .              .              .
3          .                .              .              .
4
.

私が何を意味するかは明らかですか?

于 2013-06-24T13:49:47.997 に答える