안녕하세요,
측정된 데이터를 삼각 Ksin(ax+b)+c 함수에 맞추는 데 어려움을 겪고 있습니다. 이것이 내 프로세스의 특성이며 jsl 코드로 자동으로 맞추는 방법을 찾고 있습니다.
진동이 -1과 1 사이가 되도록 데이터를 정규화하는 코드를 작성했습니다.
결국 나는 a와 b 상수를 얻고 싶습니다. (K와 c도 마찬가지지만 훨씬 쉽습니다)
내 데이터 유형에 대한 예를 첨부했습니다.
BR,
요아브
당신은 제로 크로싱 감지기 , 이는 데이터를 살펴보고 데이터가 음수에서 양수로 바뀔 때마다 이를 확인하는 작은 JSL입니다. 이것이 사인파 사이클의 시작입니다. 다음 제로 크로싱까지의 거리가 기간입니다.
여러 번 교차하는 것처럼 보이는 노이즈 데이터에 문제가 있을 수 있습니다.
영점교차는 피크보다 감지하기가 더 쉽습니다.
나는 그 아이디어를 결함 .
안녕하세요. 시간을 내주셔서 감사드립니다. 이것은 내 응용 프로그램에 대한 훌륭한 접근 방식처럼 보입니다. 그런데 생리 기간을 어떻게 "자동으로" 얻었나요? 나는 그것을 얻지 못했습니다..
요아브
좋아요, 그게 바로 제가 부족했던 직관이었습니다.대신, 그래프가 데이터에 가까워 보일 때까지 비선형 플랫폼에서 매개변수 값을 조작했지만, 매개변수가 무엇을 나타내는지 아는 것(그리고 데이터로부터 좋은 초기 추측을 얻는 것)이 훨씬 더 나은 방법입니다.
나는 사인 함수의 표준 형식인 Y = K*sin(A*(x -
) + C를 사용하는 것이 도움이 된다고 생각합니다.
귀하의 데이터에서:
K = 값 범위의 1/2
A = 2*파이/기간
B = 0에서 사인파의 시작점까지 오른쪽으로 이동
C = Y 값의 평균
비선형 회귀에 대한 시작 추정치는 분포 플랫폼 및 그래프 빌더의 다음 정의를 사용하여 찾을 수 있습니다.
K = 1/2 * (최대 - 최소) = 1/2*(47 - 17.6) = 14.7
A = 2 * 3.14 / 880 = 0.007
비 = 662
C = 34.1


비선형 r 회귀 이 접근 방식을 사용하면 이온이 매우 빠르게 수렴됩니다.모델은 이 값을 사용하여 5번의 반복으로 수렴되었습니다. 아래를 참조하세요

견적을 구하는 방법은 다음과 같습니다. ㅏ FFT 기능을 사용하는 매개변수입니다. 초 및 시간에 대한 설명은 약 1시간 동안 약 4초마다 데이터가 수집되었다고 가정합니다. FFT는 단위에 관심이 없습니다. FFT는 DC 오프셋 빈 뒤의 첫 번째 빈이 입력 데이터에서 하나의 완전한 사이클을 만들 수 있는 가장 낮은 주파수를 나타내고, 다음 빈은 2개의 완전한 사이클이 되도록 데이터의 주파수를 비닝합니다. ... 중간 빈은 ndata/입니다. 2주기. 이후의 쓰레기통은 첫 번째의 거울입니다.
dt = Open( "z:\example data.jmp" );
// by hand, I made a formula column to look at x-lag(x) and
// decided the first 79 and last 8 were not representative...
rowstart = 80;
rowstop = 937;
timeStart = dt:x[rowstart];
timeStop = dt:x[rowstop];
ydata = dt[rowstart :: rowstop, {y}]; // throw away a few with irregular time
{r, i} = FFT( {ydata} );
nBins = N Items( r );
sampleRate = (timeStop - timeStart) / (nBins - 1); // imagine there were only 2 bins...thus -1.
// the samplerate is ~4 seconds/sample...
// the highest frequency this can resolve is 1 cycle/ 8 seconds. (.125 Hz)
// frequencies higher than that will cause aliasing unless they are filtered out before this.
// the bin [nBins/2] represents the maximum frequency that can be resolved
lastBinFrequency = 1 / (2 * sampleRate); // ~ 0.125 Hz
// the first bin [1] is the DC, or offset from 0, component. We'll ignore it.
// the next bin [2] represents the frequency that has one cycle over the length of the data.
// the lowest non-DC frequency is one cycle per hour (the length of time the data was collected).
binWidth = 1 / (timeStop - timeStart); // ~0.0003Hz, or ~1 cycle per hour
// note: lastBinFrequency == (nbins-1)*binWidth/2 -- each bin is this wide, in frequency
// the remaining bins are a mirror of the first and ignored.
// combine real and imaginary bin components to get an amplitude
p = Sqrt( r ^ 2 + i ^ 2 );
dtGraph2 = As Table( ((rowstart :: rowstop) - rowstart)` || p );
dtGraph2 << Graph Builder(
Size( 1300, 500 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Col1 ), Y( :Col2 ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "Col1", ScaleBox, {Format( "Best", 12 ), Min( 0 ), Max( nBins / 2 ), Inc( 100 ), Minor Ticks( 4 )} ),
Dispatch( {}, "Col2", ScaleBox, {Format( "Best", 12 ), Min( 0 ), Max( 30000 ), Inc( 5000 ), Minor Ticks( 1 )} ),
Dispatch( {}, "graph title", TextEditBox, {Set Text( "FFT Bins" )} ),
Dispatch( {}, "X title", TextEditBox, {Set Text( "bin number" )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "size" )} )
)
);
// there is a stong DC component in this data (all values > 0) so bin 1 is the max.
If( Loc Max( p ) != 1,
Throw( "something odd" )
);
p[1] = 0; // clear the DC value
// next max after DC:
maxBinIndex = Loc Max( p ); // 5. the data repeats about (5-1)==4 times in this frame.
Write(
"\!nBiggest frequency component at ",
binWidth * (maxBinIndex - 1),
" Hz or ",
Round( 1 / (binWidth * (maxBinIndex - 1)) ),
" seconds per cycle"
);
// where does a==.007 come from?
secondsPerCycle = 1 / (binWidth * (maxBinIndex - 1));
totalSeconds = timeStop-timeStart;
cyclesInSample = totalSeconds/secondsPerCycle;//about 4
timerange = timeStop-timeStart;
a_from_fft = cyclesInSample*2*pi()/timerange; // .0073...
show(a_from_fft);
One strong response in 4th bin after DC binOne strong response in 4th bin after DC binDC 빈 이후 4번째 빈에서 강력한 반응 1개
0.00116448326055313Hz 또는 사이클당 859초에서 가장 큰 주파수 구성 요소
a_from_fft = 0.007316664113164;
DC 성분은 데이터의 평균과 관련이 있습니다. 씨 값.
이것이 당신이 원하는 것인지는 모르겠지만 비선형 플랫폼을 사용하여 이 문제를 해결할 수 있습니다.첨부된 데이터는 예측 변수 열(추정에 매개변수 사용) 및 해당 매개변수를 해결하는 스크립트와 함께 제공됩니다.솔루션이 수렴되도록 하는 매개변수에 대한 초기 추측을 얻는 데 꽤 오랜 시간이 걸렸다는 점을 인정합니다. (아마도 사인 함수에 대한 지식이 부족했기 때문일 것입니다. 이러한 함수를 사용한 지 꽤 오랜 시간이 걸렸습니다.)그러나 개념적으로는 비선형 플랫폼이 원하는 것을 달성할 것입니다.