var rpm_data_array = [];
|
var rpm_time_array = [];
|
|
let m_isRun = getQueryStringByName("isrun");
|
if (m_isRun == null || m_isRun == "")
|
m_isRun = 0;
|
|
var WaveData = function WaveData() {
|
this.update = function (waveDataJson) {
|
this.CommKeySetting = waveDataJson.CommKeySetting;
|
this.ChanSetting = waveDataJson.ChanSetting;
|
this.dcValue = setDCVal(waveDataJson.dc_value);
|
this.period = this.CommKeySetting.len / this.CommKeySetting.pointPR;
|
this.ssType = this.CommKeySetting.startStopType;
|
this.ssDataType = this.CommKeySetting.startStopDataType;
|
this.calFactor = setCalFactor(this.ChanSetting);
|
this.unit = setUnit(this.ChanSetting);
|
this.wave = waveDataJson.wave;
|
this.phyVal = setPhyVal(this.wave);
|
this.phase = setPhase(this.wave, this.period);
|
this.volVal = setVolVal(this.wave, this.calFactor);
|
}
|
|
this.updateSampInfo = updateSampInfo;
|
this.updateDataTable = updateDataTable;
|
this.updateDataTime = updateDataTime;
|
this.updateWaveChart = updateWaveChart;
|
this.updateSpecChart = updateSpecChart;
|
this.updateRPMData = updateRPMData;
|
|
function setCalFactor(ChanSetting) {
|
var factArr = [];
|
for (var i = 0; i < 8; i++) {
|
var sen_type = parseFloat(ChanSetting.senType[i]);
|
var integ_type = parseFloat(ChanSetting.integType[i]);
|
var cal_params = parseFloat(ChanSetting.calParams[i]);
|
var sensitivity = parseFloat(ChanSetting.sensitivity[i]);
|
var magnification = parseFloat(ChanSetting.magnification[i]);
|
var coeff = (1 == integ_type) ?
|
parseFloat(ChanSetting.coefficient1x[i]) :
|
parseFloat(ChanSetting.coefficient2x[i]);
|
if ((3 !== sen_type && 6 !== sen_type) || (0 === integ_type)) {
|
factArr[i] = cal_params / sensitivity;
|
} else {
|
factArr[i] = cal_params / coeff * 100.0 / sensitivity;
|
}
|
}
|
return factArr;
|
}
|
|
function setUnit(ChanSetting) {
|
var unit = [];
|
var unitStore = ['μm', 'mm/s', 'g', 'unit', 'unit', 'g', 'mm/s', 'μm'];
|
|
for (var i = 0; i < 8; i++) {
|
var senType = parseInt(ChanSetting.senType[i]);
|
var integType = parseInt(ChanSetting.integType[i]);
|
if ((3 != senType && 6 != senType) || 0 === integType) {
|
unit[i] = unitStore[senType - 1];
|
} else if (1 === integType) {
|
unit[i] = unitStore[1];
|
} else if (2 === integType) {
|
unit[i] = unitStore[0];
|
} else {
|
unit[i] = unitStore[3]
|
}
|
}
|
return unit;
|
}
|
|
function setWave(waveDataJson, calFactor, chartType) {
|
var dataArr = [];
|
$.each(waveDataJson.wave, function (index, value) {
|
var xdata = [];
|
$.each(value, function (i, data) {
|
xdata[i] = parseFloat((parseInt((chartType) ? data / calFactor[index] : data)).toFixed(3));
|
})
|
dataArr.push(xdata);
|
});
|
return dataArr;
|
}
|
|
function setPhyVal(wave) {//计算['有效值','有效峰值','有效峰峰值','真峰值','真峰峰值']
|
var phyArr = [];
|
$.each(wave, function (i, value) {
|
var xrms = GetXrms(value);
|
var pp = GetPP(value);
|
var preArr = [1, 2, 0, 0, 1];
|
var valArr = [
|
xrms.toFixed(1),
|
(1.414 * xrms).toFixed(2),
|
(2 * 1.414 * xrms).toFixed(0),
|
(pp / 2).toFixed(1),
|
pp.toFixed(0)
|
];
|
phyArr.push(valArr);
|
});
|
return phyArr;
|
}
|
|
function setDCVal(dcVal) {//计算直流电压值
|
var DCArr = [];
|
$.each(dcVal, function (index, value) {
|
var val = parseFloat(value);
|
if (val > 1000) {
|
DCArr[index] = (val / 1000).toFixed(2) + ' V';
|
} else {
|
DCArr[index] = (val).toFixed(2) + ' mV';
|
}
|
})
|
return DCArr;
|
}
|
|
function setPhase(wave, period) {//相位
|
var phaArr = [];
|
period = parseInt(period);
|
var calPeriod = (period > 4) ? 4 : period;
|
|
$.each(wave, function (i, value) {
|
|
var calLen = value.length * calPeriod / period;
|
var calData = new Array();
|
calData = value.slice(0, calLen);
|
var pha = get1XAmpPha(calData, calPeriod);
|
phaArr.push((pha[1] * 180 / Math.PI).toFixed(2));
|
});
|
// console.log(phaArr,118)
|
return phaArr;
|
}
|
|
function setVolVal(wave, calFactor) {//电压值
|
var tempArr = [];
|
var VolArr = [];
|
$.each(wave, function (index, value) {
|
$.each(value, function (i, val) {
|
tempArr[i] = parseFloat(val) / calFactor[index];
|
})
|
VolArr[index] = (GetXrms(tempArr)).toFixed(2);
|
})
|
return VolArr;
|
}
|
|
function updateSampInfo() {
|
var str = "采集模式:自由采集; ";
|
|
if (this.CommKeySetting.keyOn === 1) {
|
str = "采集模式:同步整周期采集;" + (this.ssType === 0 ? '正常数据' : '启停车数据') +
|
" 每周期采样点数:" + this.CommKeySetting.pointPR + '; ';
|
}
|
str += "采样频率:" + parseFloat(this.CommKeySetting.fs) +
|
"Hz; 采样长度:" + this.CommKeySetting.len +
|
"; 当前转速:" + parseFloat(this.CommKeySetting.rpm).toFixed(2) + '转/分';
|
$("#realdata").val(str);
|
}
|
|
function judgeUpdate() {
|
// var flag = document.getElementById("updateFlag");
|
// if (flag !== null && parseInt(flag.value) === 0) {
|
// return true;
|
// } else {
|
// return false;
|
// }
|
return true
|
}
|
|
function updateDataTable() {
|
if (!judgeUpdate()) {
|
return;
|
}
|
var obj = this;
|
var type = parseInt($('#valSel').val());
|
$.each(this.wave, function (i, value) {
|
document.getElementById('val' + (i + 1)).innerHTML = obj.phyVal[i][type] + ' ' + obj.unit[i];
|
document.getElementById('direct' + (i + 1)).innerHTML = obj.dcValue[i]; //直流
|
document.getElementById('parse' + (i + 1)).innerHTML = obj.phase[i] + ' 度'; //相位
|
document.getElementById('vol' + (i + 1)).innerHTML = obj.volVal[i] + ' mV'; //电压值
|
})
|
}
|
|
function updateDataTime() {
|
var dom = document.getElementById("dataTime");
|
if (dom === null) {
|
return;
|
}
|
if (!judgeUpdate()) {
|
return;
|
}
|
// var date = new Date(this.CommKeySetting.dataTime * 1000);
|
var date = new Date();
|
var y = date.getFullYear();
|
var m = date.getMonth() + 1;
|
m = m < 10 ? ('0' + m) : m;
|
var d = date.getDate();
|
d = d < 10 ? ('0' + d) : d;
|
var h = date.getHours();
|
h = h < 10 ? ('0' + h) : h;
|
var minute = date.getMinutes();
|
var second = date.getSeconds();
|
minute = minute < 10 ? ('0' + minute) : minute;
|
second = second < 10 ? ('0' + second) : second;
|
|
$("#dataTime").val(y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second);
|
}
|
|
function updateWaveChart() {
|
// console.log(this.wave,203)
|
var chart = document.getElementById("waveHolder"); //获得table对象
|
if (chart === null) {
|
return;
|
}
|
if (!judgeUpdate()) {
|
return;
|
}
|
var wave_data_array = [];
|
var wave_data_arrayX = [];
|
var obj = this;
|
$.each(this.wave, function (index, value) {
|
var xdata = [];
|
$.each(value, function (i, data) {
|
xdata[i] = parseFloat((parseFloat(parseInt(($('#wave_type').val())) === 1 ? data / obj.calFactor[index] : data)).toFixed(3));
|
})
|
wave_data_array.push(xdata);
|
});
|
var pointTime = 1000 / this.CommKeySetting.fs;// fs 采用频率
|
$.each(wave_data_array[0], function (index, value) {
|
wave_data_arrayX[index] = (index * pointTime).toFixed(2);
|
})
|
|
chart_data_flush(myChart, wave_data_arrayX, wave_data_array, this.unit);
|
}
|
|
function updateSpecChart() {
|
var chart = document.getElementById("specHolder"); //获得table对象
|
if (chart === null) {
|
return;
|
}
|
if (!judgeUpdate()) {
|
return;
|
}
|
var spec_data_array = [];
|
var spec_data_arrayX = [];
|
$.each(this.wave, function (index, value) {
|
spec_data_array.push(getAmp(value, 0));
|
});
|
|
var obj = this;
|
$.each(spec_data_array[0], function (index, value) {
|
spec_data_arrayX[index] = (index * obj.CommKeySetting.fs / obj.CommKeySetting.len).toFixed(2);
|
})
|
chart_data_flush(myvibChart, spec_data_arrayX, spec_data_array, this.unit);
|
}
|
|
function updateRPMData() {
|
$("#real_rpm_value").val(parseFloat(this.CommKeySetting.rpm).toFixed(0));
|
rpm_data_array.push(parseFloat(this.CommKeySetting.rpm).toFixed(2));
|
var unixTimestamp = new Date(this.CommKeySetting.dataTime * 1000);
|
rpm_time_array.push(unixTimestamp.toLocaleTimeString());
|
if (rpm_data_array.length > 1000) {
|
rpm_data_array.shift();
|
rpm_time_array.shift();
|
}
|
var chart = document.getElementById("rpmChart"); //获得table对象
|
if (chart !== null) {
|
if (rpm_data_array.length > 1) {
|
//rpmChart.hideLoading();
|
}
|
rpmChart.setOption({
|
xAxis: {
|
data: rpm_time_array, //填入X轴数据
|
},
|
yAxis: {
|
min: function (value) {
|
return (value.min * 0.8).toFixed(0);
|
|
},
|
max: function (value) {
|
return (value.max * 1.1).toFixed(0);
|
},
|
},
|
dataZoom: [{
|
id: 'dataZoomY',
|
type: 'slider',
|
xAxisIndex: [0],
|
filterMode: 'empty'
|
}],
|
visualMap: {
|
show: false,
|
pieces: [{
|
lte: ssMinRPM,
|
color: 'green'
|
}, {
|
gt: ssMinRPM,
|
lte: ssMaxRPM,
|
color: 'red'
|
}, {
|
gt: ssMaxRPM,
|
color: 'green'
|
}]
|
},
|
series: [{
|
data: rpm_data_array,
|
markArea: {
|
|
// data: [[{
|
// name: '启停车范围',
|
// yAxis: ssMinRPM
|
// }, {
|
// yAxis: ssMaxRPM
|
// }]]
|
},
|
markLine: {
|
silent: false,
|
data: [
|
[{
|
name: '启停最小转速',
|
yAxis: ssMinRPM,
|
xAxis: rpm_time_array[0]
|
}, {
|
yAxis: ssMinRPM,
|
x: '90%'
|
}],
|
[{
|
name: '启停最大转速',
|
yAxis: ssMaxRPM,
|
xAxis: rpm_time_array[0]
|
}, {
|
yAxis: ssMaxRPM,
|
x: '90%'
|
}
|
|
],
|
[{
|
name: '额定转速',
|
yAxis: ssRatRPM,
|
xAxis: rpm_time_array[0]
|
}, {
|
yAxis: ssRatRPM,
|
x: '90%'
|
}
|
|
]
|
|
]
|
}
|
|
}],
|
});
|
}
|
}
|
}
|
var dataObj = new WaveData();
|
|
function data_read() {
|
let dataListT = dataListOff
|
if (m_isRun==1) {
|
dataListT = dataList
|
}
|
data_json_parsh(dataListT[0]);
|
//console.log(dataListT)
|
var temp = 0
|
setInterval(() => {
|
var n = parseInt(Math.random() * 100) % (dataListT.length > 1 ? dataListT.length - 1 : 1)
|
if (temp == n) {
|
if (n >= dataListT.length) {
|
n--
|
} else {
|
n++
|
}
|
}
|
data_json_parsh(dataListT[n]);
|
temp = n
|
}, 1000 * 5)
|
|
return
|
$.ajax({
|
type: 'POST',
|
url: "./data.js",
|
dataType: "text",
|
data: "action=2",
|
success: function (msg) {
|
console.log(msg)
|
//data_read();
|
if (msg.length > 100) {
|
data_json_parsh(msg);
|
} else {
|
console.log("[WAVE_GET_ERROR]: " + msg);
|
}
|
},
|
error: function (errorMsg) {
|
window.setTimeout(function () {
|
//data_read();
|
}, 500);
|
console.log("[WAVE_ACTION_ERROR]: ");
|
console.log(errorMsg);
|
},
|
});
|
return false;
|
}
|
|
|
function data_json_parsh(cfgJson) {
|
|
var jsonObj = cfgJson;
|
if (parseInt(jsonObj.CommKeySetting.dataTime) === 0) {
|
return;
|
}
|
dataObj.update(jsonObj);
|
// dataObj.updateSampInfo();
|
// dataObj.updateDataTable();
|
dataObj.updateDataTime();
|
dataObj.updateWaveChart();
|
dataObj.updateSpecChart();
|
dataObj.updateRPMData();
|
}
|
|
|
function updateControl() {
|
if (document.getElementById("updateFlag").value == "0") {
|
document.getElementById("updateFlag").value = "1";
|
var btn = document.getElementById("btn_stop");
|
btn.innerHTML = "采集";
|
} else {
|
document.getElementById("updateFlag").value = "0";
|
var btn = document.getElementById("btn_stop");
|
btn.innerHTML = "停止";
|
}
|
}
|
|
function changeValBySel() {
|
var type = parseInt($('#valSel').val());
|
$.each(dataObj.wave, function (i, value) {
|
document.getElementById('val' + (i + 1)).innerHTML = dataObj.phyVal[i][type] + ' ' + dataObj.unit[i];
|
});
|
}
|
|
function searchChange() {
|
if (document.getElementById("searchChangeFlg").value == "0") {
|
document.getElementById("phase").style.display = "table-row";
|
document.getElementById("voltageValue").style.display = "table-row";
|
document.getElementById("searchChange").innerHTML = "收起 <span class='glyphicon glyphicon-chevron-up '></span>";
|
document.getElementById("searchChangeFlg").value = "1";
|
} else {
|
document.getElementById("phase").style.display = "none";
|
document.getElementById("voltageValue").style.display = "none";
|
document.getElementById("searchChange").innerHTML = "更多内容<span class='glyphicon glyphicon-chevron-down'></span>";
|
document.getElementById("searchChangeFlg").value = "0";
|
}
|
return false;
|
}
|
|
function init_wave_chart(chart, name, X_unit) {
|
var series_arr = [];
|
var yAxisArr = [];
|
var color_arr = new Array(
|
'rgb(0, 0, 255)', 'rgb(238, 0, 126)', 'rgb(0, 255, 0)', 'rgb(255, 0, 0)',
|
'rgb(255, 128, 255)', 'rgb(128, 128, 192)', 'rgb(0, 64, 128)', 'rgb(64, 128, 128)'
|
);
|
var yAxisName = new Array('加速度:g');
|
// for (var i = 0; i < data.wave.length; i++) {
|
// series_arr.push({
|
// name: '通道' + (i + 1),
|
// type: 'line',
|
// smooth: true,
|
// symbolSize: 0,
|
// sampling: 'max',
|
// itemStyle: {
|
// normal: {
|
// lineStyle: {
|
// width: 1,
|
// },
|
// color: color_arr[i]
|
// }
|
// },
|
// symbolSize: 1,
|
// data: []
|
// });
|
// }
|
series_arr.push({
|
name: '通道' + (0 + 1),
|
type: 'line',
|
smooth: true,
|
symbolSize: 0,
|
sampling: 'max',
|
itemStyle: {
|
normal: {
|
lineStyle: {
|
width: 1,
|
},
|
color: color_arr[0]
|
}
|
},
|
symbolSize: 1,
|
data: []
|
});
|
for (var i = 0; i < yAxisName.length; i++) {
|
yAxisArr.push({
|
type: 'value',
|
name: yAxisName[i],
|
nameGap: 35,
|
nameLocation: 'center',
|
position: (i > 2) ? 'right' : 'left',
|
offset: 50 * (i % 3),
|
min: function (value) {
|
var minVal = (value.min * 1.1).toFixed(0);
|
minVal = (minVal > value.min) ? (value.min - (minVal - value.min)).toFixed(4) : minVal;
|
return minVal;
|
},
|
max: function (value) {
|
var maxVal = (value.max * 1.1).toFixed(0);
|
maxVal = (maxVal < value.max) ? (value.max + (value.max - maxVal)).toFixed(4) : maxVal;
|
return maxVal;
|
},
|
boundaryGap: [0, '100%']
|
});
|
}
|
option = {
|
//legend: {
|
// type: 'scroll',
|
// left: 80,
|
// right: 80,
|
// data: ['通道1', '通道2', '通道3', '通道4', '通道5', '通道6', '通道7', '通道8'],
|
//},
|
grid: {
|
top: 20,
|
left: 50 + (yAxisName.length > 2 ? 100 : (yAxisName.length - 1)*50),
|
right: (yAxisName.length > 2 ? (yAxisName.length % 3) * 50:20)
|
},
|
xAxis: {
|
name: X_unit,
|
type: 'category',
|
position: 'bottom',
|
boundaryGap: [0, '100%'],
|
nameLocation: 'center',
|
nameGap: 23,
|
data: []
|
},
|
yAxis: yAxisArr,
|
dataZoom: [{
|
type: 'inside',
|
start: 0,
|
end: 100
|
}, {
|
id: 'dataZoomY',
|
type: 'slider',
|
xAxisIndex: [0],
|
filterMode: 'empty'
|
|
}],
|
|
tooltip: {
|
trigger: 'axis',
|
hideDelay: 1000,
|
axisPointer: {
|
type: 'cross'
|
},
|
position: function (pt) {
|
return [pt[0], '10%'];
|
},
|
},
|
series: series_arr,
|
animationEasing: 'elasticOut',
|
};
|
chart.setOption(option);
|
}
|
|
function getyAxisIndex(unit) {
|
if (unit === 'g') {
|
return 0;
|
} else if (unit === 'μm') {
|
return 2;
|
} else if (unit === 'mm/s') {
|
return 1;
|
} else if (unit === 'mV') {
|
return 3;
|
} else {
|
return 4;
|
}
|
}
|
|
function chart_data_flush(chart, X_data, Y_data, unitArr) {
|
if (Y_data.length > 0) {
|
//chart.hideLoading();
|
}
|
var series_temp = [];
|
// for (var i = 0; i < Y_data.length; i++) {
|
// series_temp.push({
|
// name: '通道' + (i + 1),
|
// data: Y_data[i],
|
// yAxisIndex: getyAxisIndex(parseInt($("#wave_type").val()) === 1 ? 'mV' : unitArr[i]),
|
// });
|
// }
|
series_temp.push({
|
name: '通道' + (0 + 1),
|
data: Y_data[0],
|
yAxisIndex: getyAxisIndex(parseInt($("#wave_type").val()) === 1 ? 'mV' : unitArr[0]),
|
});
|
chart.setOption({
|
xAxis: {
|
data: X_data //填入X轴数据
|
},
|
tooltip: {
|
formatter: function (params) {
|
var data = params[0].name + '<br/>';
|
for (var i = 0; i < params.length; i++) {
|
data += '通道' + (params[i].seriesIndex + 1) + ': ' + params[i].data + (parseInt($("#wave_type").val()) === 1 ? 'mV' : unitArr[params[i].seriesIndex]) + '<br/>'
|
}
|
return data;
|
}
|
},
|
series: series_temp
|
});
|
|
}
|
|
function GetXrms(Signal) {//数组内数据平方和在开平方
|
var Sum = 0.0;
|
for (var i = 0; i < Signal.length; i++) Sum += Signal[i] * Signal[i];
|
Sum = Math.sqrt(Sum / Signal.length);
|
return Sum;
|
}
|
|
function GetPP(Signal) {//数据max min 差值
|
var max, min;
|
max = min = parseFloat(Signal[0]);
|
for (var i = 1; i < Signal.length; i++) {
|
var temp = parseFloat(Signal[i]);
|
if (temp > max) max = temp;
|
if (temp < min) min = temp;
|
}
|
return (max - min);
|
}
|
|
function get1XAmpPha(buff, period) {
|
var ret = [];
|
var temp = new Array(buff.length);
|
$.each(buff, function (i, value) {
|
temp[i] = parseFloat(value);
|
})
|
period = parseInt(period);
|
var AmpPha = getAmpPha(temp, 1);
|
|
ret[0] = AmpPha[0][period];
|
ret[1] = AmpPha[1][period];
|
|
ret[2] = AmpPha[0][period * 2];
|
ret[3] = AmpPha[1][period * 2];
|
|
// console.log(ret,buff,period,1010)
|
return ret;
|
}
|
|
function getAmpPha(buff, type) {
|
var rel = [];
|
var img = [];
|
|
for (var i = 0; i < buff.length; i++) {
|
rel[i] = parseFloat(buff[i]);
|
img[i] = 0.0;
|
}
|
var AmpPha = new Array(2);
|
var rlen = parseInt((buff.length) / 2.56);
|
AmpPha[0] = new Array(rlen);
|
AmpPha[1] = new Array(rlen);
|
|
var f = 1.0;
|
if (type === 1) {
|
f = 1.9842962399999999;
|
} else if (type === 2) {
|
f = 1.83969614;
|
}
|
|
window_cal(rel, type);
|
FFT(rel, img, 1);
|
|
for (var i = 0; i < rlen && i < rel.length; i++) {
|
AmpPha[0][i] = 2 * f * Math.sqrt(rel[i] * rel[i] + img[i] * img[i]);
|
}
|
for (var i = 0; i < rlen && i < rel.length; i++) {
|
if (AmpPha[0][i] <= 0.05) {
|
AmpPha[1][i] = 0.0;
|
} else {
|
AmpPha[1][i] = getAngle(rel[i], img[i]);
|
}
|
}
|
|
return AmpPha;
|
}
|
|
function GetAmpLen(N) {
|
var n = 200;
|
switch (N) {
|
case 64: // '@'
|
n = 25;
|
break;
|
|
case 128:
|
n = 50;
|
break;
|
|
case 256:
|
n = 100;
|
break;
|
|
case 512:
|
n = 200;
|
break;
|
|
case 1024:
|
n = 400;
|
break;
|
|
case 2048:
|
n = 800;
|
break;
|
|
case 4096:
|
n = 1600;
|
break;
|
|
case 8192:
|
n = 3200;
|
break;
|
|
case 16384:
|
n = 6400;
|
break;
|
|
case 32768:
|
n = 12800;
|
break;
|
|
case 65536:
|
n = 25600;
|
break;
|
|
}
|
return n;
|
}
|
|
function Invspec(srcdat) {
|
|
var xc = [];
|
var xs = [];
|
var AmpLen = GetAmpLen(srcdat.length);
|
var invspec = new Array(AmpLen);
|
|
for (var i = 0; i < srcdat.length; i++) {
|
xc[i] = srcdat[i];
|
xs[i] = 0.0;
|
}
|
|
window_cal(xc, 1);
|
FFT(xc, xs, 1);
|
|
for (var i = 0; i < srcdat.length / 2; i++) {
|
|
xc[i] = (2 * Math.sqrt(xc[i] * xc[i] + xs[i] * xs[i]));
|
|
if (xc[i] < 0.00020000000000000001) {
|
xc[i] = -116;
|
} else {
|
xc[i] = parseFloat((10 * Math.log((xc[i] * xc[i]) / 1000000)) / Math.log(10));
|
}
|
xs[i] = 0.0;
|
}
|
|
for (var i = srcdat.length / 2; i < srcdat.length; i++) {
|
xc[i] = 0.0;
|
xs[i] = 0.0;
|
}
|
|
var Sum = 0.0;
|
for (var i = 0; i < srcdat.length / 2; i++) {
|
Sum = (Sum + xc[i]);
|
}
|
|
Sum /= srcdat.length / 2;
|
for (var i = 0; i < srcdat.length / 2; i++) {
|
xc[i] = xc[i] - Sum;
|
}
|
|
FFT(xc, xs, 1);
|
var d = invspec.length;
|
if (d > xc.length - 1) {
|
d = xc.length - 1;
|
}
|
if (d > xs.length - 1) {
|
d = xs.length - 1;
|
}
|
for (var i = 0; i < d; i++) {
|
invspec[i] = 2.0 * Math.sqrt(xc[i] * xc[i] + xs[i] * xs[i]);
|
invspec[i] = invspec[i] * invspec[i];
|
}
|
|
return invspec;
|
}
|
|
function getAmp(srcdat, type) {
|
var amp = new Array(parseInt(srcdat.length / 2.56));
|
var rel = [];
|
var img = [];
|
for (var i = 0; i < srcdat.length; i++) {
|
rel[i] = parseFloat(srcdat[i]);
|
img[i] = 0.0;
|
}
|
var f = 1.0;
|
if (type === 1) {
|
f = 1.9842962399999999;
|
} else if (type === 2) {
|
f = 1.83969614;
|
}
|
|
window_cal(rel, type);
|
FFT(rel, img, 1);
|
for (var i = 0; i < parseInt(srcdat.length / 2.56); i++) {
|
amp[i] = parseFloat((2.0 * f * Math.sqrt(rel[i] * rel[i] + img[i] * img[i])).toFixed(3));
|
}
|
return amp;
|
}
|
|
function window_cal(xc, type) {
|
var n = xc.length;
|
var al, cs;
|
switch (type) {
|
case 1:
|
for (var i = 0; i < n; i++) {
|
al = (parseFloat(i) * 2.0 * Math.PI / parseFloat(n));
|
cs = parseFloat(Math.cos(al));
|
xc[i] = xc[i] * (1 + cs) / 2;
|
}
|
break;
|
case 2:
|
for (var i = 0; i < n; i++) {
|
al = (parseFloat(i) * 2.0 * Math.PI / parseFloat(n));
|
cs = parseFloat(Math.cos(a1));
|
xc[i] = xc[i] * (0.54 + 0.46 * cs);
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
|
function FFT(Re, Im, Flag) {
|
var N = Re.length;
|
if (N > Im.length) {
|
N = Im.length;
|
}
|
var m = 0;
|
var j = 1
|
var i = 1;
|
do {
|
if (i >= 16) {
|
break;
|
}
|
m = i;
|
j = 2 * j;
|
if (j === N) {
|
break;
|
}
|
i++
|
} while (true);
|
var n1 = N - 1;
|
j = 0;
|
for (i = 0; i < n1; i++) {
|
if (i > j) {
|
var tr = Re[j];
|
var ti = Im[j]
|
Re[j] = Re[i];
|
Im[j] = Im[i];
|
Re[i] = tr;
|
Im[i] = ti;
|
}
|
var k;
|
for (k = parseInt(N / 2); k < j + 1; k = parseInt(k / 2)) {
|
j -= k;
|
}
|
j += k;
|
}
|
n1 = 1;
|
|
for (var l = 1; l <= m; l++) {
|
n1 = 2 * n1;
|
var n2 = parseInt(n1 / 2);
|
var e = parseFloat(Math.PI / n2);
|
var c = 1.0;
|
var s = 0.0;
|
var c1 = Math.cos(e);
|
var s1 = parseFloat((-Flag) * Math.sin(e));
|
for (j = 0; j < n2; j++) {
|
for (i = j; i < N; i += n1) {
|
var k = i + n2;
|
if (k > N - 1) {
|
k = N - 1;
|
}
|
var tr = c * Re[k] - s * Im[k];
|
var ti = c * Im[k] + s * Re[k];
|
|
Re[k] = Re[i] - tr;
|
Im[k] = Im[i] - ti;
|
Re[i] = Re[i] + tr;
|
Im[i] = Im[i] + ti;
|
}
|
|
var t = c;
|
|
c = c * c1 - s * s1;
|
s = t * s1 + s * c1;
|
}
|
}
|
|
if (Flag === 1) {
|
for (i = 0; i < N; i++) {
|
if (i <= Re.length - 1 && i <= Im.length - 1) {
|
Re[i] /= N;
|
Im[i] /= N;
|
}
|
}
|
}
|
Re[0] = 0;
|
Im[0] = 0;
|
}
|
|
function getAngle(x, y) {
|
var phase = Math.atan2(y, x);
|
if (phase >= 2 * Math.PI) {
|
phase -= 2 * Math.PI;
|
}
|
if (phase < 0) {
|
phase += 2 * Math.PI;
|
}
|
return (2 * Math.PI - phase);
|
}
|