2015-08-22 2 views
0

У меня есть эскиз обработки, который считывает уровень звука каждую секунду. Она выводит его в файл, конечный результат выглядит как это:Среднее значение каждого «x» в массиве в node.js

17.51.11, 0.05900923, 0.059008658 
17.51.12, 0.4037964, 0.40379566 
17.51.13, 0.10111399, 0.101112984 
17.51.14, 0.5614912, 0.56148833 
17.51.15, 0.45223546, 0.45223528 
17.51.16, 0.1956841, 0.19568439 
17.51.17, 0.17803124, 0.17803174 

(! Два значения левой и правой аудиовход, я также хотел бы усреднить их, если это возможно)

импорта Node и разделяет эти данные и выводит их на диаграмму (используя chart.js) - однако, очевидно, что в течение любого реального времени график будет либо нечитаемым, либо глупо длинным. Поэтому я хочу получить среднее значение данных за каждую минуту. Я не уверен, как это сделать - и я волнуюсь за то, что набрал метку времени.

var http = require('http'); 
var fs = require('fs'); 
var results = []; 
var left = []; 
var right = []; 
var timestamp = []; 
var rightfin = []; 
var timefin = []; 
var leftfin = []; 

fs.readFile('20.8.2015_17.51.9.txt', "utf-8", function (err, data) { 
    if (err) throw err; 
    results = data.split("\n"); 
}); 

function callback() { 
    var lines = results; 
    for (var line in lines) { 
     var x = []; 
     x = lines[line].split(", "); 
     timestamp.push("'" + x[0] + "'"); 
     //doesn't seem to work without adding quotes. 
     left.push(x[1] * 1000); 
     right.push(x[2] * 1000); 
    } 

} 

http.createServer(function (request, response) { 
    callback(); 
    var leftfin = left.toString('utf8'); 
    var rightfin = right.toString('utf8'); 
    var timefin = timestamp.toString('utf8'); 
    fs.readFile('chart.js', function (err, data) { 
     if (err) { throw err }; 
     response.writeHead(200, { 'Content-Type': 'text/html' }); 
     var chartjs = data.toString('utf-8'); 
     response.write("<html>\n<head><meta charset='utf-8'><script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>\n<title>Sound Levels</title>\n</head><body onLoad='init()'><script type = 'text/javascript'>\n" + chartjs); 
     response.write("window.onLoad = function() \n{init();};\n function init() {"); 
     response.write("\nvar ctx = $('#line').get(0).getContext('2d'); \nvar data = { \nlabels: ["); 
     response.write(timefin); 
     response.write("], \ndatasets: [ \n{ \nlabel: 'My First dataset', \nfillColor: 'rgba(220,220,220,0.5)', \nstrokeColor: 'rgba(220,220,220,0.8)', \nhighlightFill: 'rgba(220,220,220,0.75)',\nhighlightStroke: 'rgba(220,220,220,1)', \ndata: ["); 
     response.write(leftfin); 
     response.write("]}, \n{ \nlabel: 'My Second dataset', \nfillColor: 'rgba(151,187,205,0.5)', \nstrokeColor: 'rgba(151,187,205,0.8)', \nhighlightFill: 'rgba(151,187,205,0.75)', \nhighlightStroke: 'rgba(151,187,205,1)', \ndata: ["); 
     response.write(rightfin); 
     response.write("] \n} ]\n}; \nvar myBarChart = new Chart(ctx).Bar(data);}</script>"); 
     response.write(" <center> <canvas id='line' width='7500' height='400'> </canvas></center> </body></html>"); 
     response.end(); 
    }); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 
+0

где вызов 'обратного вызова()'? в чем проблема? – yoavmatchulsky

+0

вызов обратного вызова позже - я включил только код, который, как я думал, был уместным –

+0

Файл имеет строку в секунду (за X минут), и вы хотите усреднить каждую минуту до одного столбца? например в вашем примере 17,51 - это время, не так ли? – yoavmatchulsky

ответ

1

Вот версия для обратного вызова:

var parseLines = function(lines) { 
    // make sure we have lines, or return a default 
    if (lines == null || !lines.length) { return [0.0, 0.0]; } 

    var left_sum = 0.0 
    , right_sum = 0.0 
    , line, i, left, right; 

    // use for(;;) instead of for in, to exclude properties that are not values 
    for (i = 0; i < lines.length; i += 1) { 
    line = lines[i].split(','); 
    // trim each number from whitespace and make it its a float 
    left = parseFloat(line[1].trim()); 
    right = parseFloat(line[2].trim()); 

    if (isNaN(left) || isNaN(right)) { continue; } 

    left_sum += left; 
    right_sum += right; 
    } 

    // return an array of [ left_average, right_average ] 
    return [ left_sum/lines.length, right_sum/lines.length ]; 
}; 

var averages = parseLines(results); 
+0

Спасибо! Так я помещаю это в функцию обратного вызова? Извините, это выглядит действительно полезно, но я не уверен, как его реализовать (я супер новый на этом). И теперь я называю left_sum и right_sum в диаграмме или средних? И как мне получить отметку времени для масштабирования. Сожалею! –

+0

Также он говорит для строки 'return [left_sum/lines.length, right_sum/lines.length];' "Левая сторона арифметической операции должна быть типа any, number или enum type. Означает ли это что-нибудь для вас? –

+0

Я обновил свой вопрос, чтобы показать весь код, который у меня был до сих пор, чтобы вы могли видеть, где я называю значения, используемые в диаграммах. :) –

Смежные вопросы