yonge 3 gadi atpakaļ
vecāks
revīzija
880c7702e1

+ 37 - 15
audio-analysis/src/main/java/com/yonge/nettty/dto/UserChannelContext.java

@@ -238,7 +238,6 @@ public class UserChannelContext implements PitchDetectionHandler {
 
 	public void handle1(float[] samples, AudioFormat audioFormat){
 		
-		//FrequencyDetector frequencyDetector = new FrequencyDetector(samples, audioFormat.getSampleRate(), true);
 		YINPitchDetector frequencyDetector = new YINPitchDetector(samples.length , audioFormat.getSampleRate());
 
 		double playFrequency = frequencyDetector.getFrequency(samples);
@@ -266,7 +265,7 @@ public class UserChannelContext implements PitchDetectionHandler {
 		//取出当前处理中的音符信息
 		NoteAnalysis noteAnalysis = getProcessingNote();
 		if(noteAnalysis == null || noteAnalysis.getDurationTime() == 0) {
-			noteAnalysis = new NoteAnalysis(musicXmlNote.getMusicalNotesIndex(), musicXmlNote.getMeasureIndex(), musicXmlNote.getFrequency(), noteAnalysis.getDurationTime());
+			noteAnalysis = new NoteAnalysis(musicXmlNote.getMusicalNotesIndex(), musicXmlNote.getMeasureIndex(), musicXmlNote.getFrequency(), musicXmlNote.getDuration());
 		}
 		
 		evaluatingSectionIndex.set(noteAnalysis.getSectionIndex());
@@ -280,7 +279,6 @@ public class UserChannelContext implements PitchDetectionHandler {
 				}
 
 				if(noteAnalysis.getChunkFrequencyList().size() > 0){
-					//noteAnalysis.setPlayFrequency(noteAnalysis.getChunkFrequencyList().stream().mapToDouble(t -> t).sum()/noteAnalysis.getChunkFrequencyList().size());
 					noteAnalysis.setPlayFrequency(computeFrequency(noteAnalysis.getChunkFrequencyList(), 10));
 				}
 				
@@ -307,13 +305,36 @@ public class UserChannelContext implements PitchDetectionHandler {
 					}
 				}
 				
+				if (tempo) {
+					// 获取上一个音符信息
+					if (doneNoteAnalysisList.size() > 0) {
+						NoteAnalysis lastNoteAnalysis = doneNoteAnalysisList.get(doneNoteAnalysisList.size() - 1);
+						if (lastNoteAnalysis != null) {
+							double pf = lastNoteAnalysis.getPlayFrequency();
+							int continueSize = 0;
+							for (int i = 0; i < chunkAnalysisList.size(); i++) {
+								chunkAnalysis = chunkAnalysisList.get(i);
+								if (chunkAnalysis != null) {
+									if (Math.abs(chunkAnalysis.getFrequency() - pf) > 10) {
+										break;
+									}
+									continueSize++;
+								}
+							}
+							if(continueSize * 100 / chunkAnalysisList.size() > 40){
+								tempo = false;
+							}
+						}
+					}
+				}
+				
 				noteAnalysis.setTempo(tempo);
 				
-				long wrongChunkSize = chunkAnalysisList.stream().filter(t -> Math.abs(t.getFrequency() - avgFrequency) > 10).count();
+				/*long wrongChunkSize = chunkAnalysisList.stream().filter(t -> Math.abs(t.getFrequency() - avgFrequency) > 10).count();
 				if(wrongChunkSize * 100 /chunkAnalysisList.size() > 40){
 					noteAnalysis.setTempo(false);
 				}
-				
+				*/
 				evaluateForNote(noteAnalysis);
 
 				LOGGER.info("当前音符下标[{}] 预计频率:{} 实际频率:{} 持续时间:{}", noteAnalysis.getMusicalNotesIndex(), musicXmlNote.getFrequency(), noteAnalysis.getPlayFrequency(),
@@ -334,10 +355,10 @@ public class UserChannelContext implements PitchDetectionHandler {
 				}
 				
 				NoteAnalysis nextNoteAnalysis = new NoteAnalysis(nextNoteIndex, getMusicSectionIndex(null, nextNoteIndex), nextNoteFrequence, standDuration);
-				if (noteAnalysis.isTempo() == true && wrongChunkSize == 0) {
+				/*if (noteAnalysis.isTempo() == true && wrongChunkSize == 0) {
 					nextNoteAnalysis.setTempo(false);
 					LOGGER.info("节奏错误:频率没变");
-				}
+				}*/
 
 				noteAnalysis = nextNoteAnalysis;
 
@@ -363,7 +384,7 @@ public class UserChannelContext implements PitchDetectionHandler {
 					noteAnalysis.setPlayDurationTime(noteAnalysis.getPlayDurationTime() + durationTime);
 				}
 				
-				chunkAnalysisList.add(new ChunkAnalysis(playFrequency, splDb, power));
+				chunkAnalysisList.add(new ChunkAnalysis(receivedTime - durationTime, receivedTime, playFrequency, splDb, power));
 				
 			}
 
@@ -612,18 +633,18 @@ public class UserChannelContext implements PitchDetectionHandler {
 		// 排序
 		chunkFrequencyList = chunkFrequencyList.stream().sorted().collect(Collectors.toList());
 
-		double tempFrequency = 0, totalFrequency = 0;
+		double tempFrequency = chunkFrequencyList.get(0), totalFrequency = chunkFrequencyList.get(0);
 
 		int maxChunkSize = 0;
-		double frequency = 0;
+		double frequency = chunkFrequencyList.get(0);
 		int chunkSize = 1;
 		double avgFrequency = chunkFrequencyList.get(0);
 		for (int i = 1; i < chunkFrequencyList.size(); i++) {
 			tempFrequency = chunkFrequencyList.get(i);
 
-			totalFrequency += tempFrequency;
-
 			if (Math.abs(avgFrequency - tempFrequency) > offsetRange) {
+				
+				avgFrequency = totalFrequency / chunkSize;
 
 				if (maxChunkSize < chunkSize) {
 					maxChunkSize = chunkSize;
@@ -632,13 +653,14 @@ public class UserChannelContext implements PitchDetectionHandler {
 
 				chunkSize = 1;
 				avgFrequency = tempFrequency;
+				totalFrequency = tempFrequency;
 			} else {
 				chunkSize++;
-				avgFrequency = (tempFrequency + avgFrequency) / 2;
+				totalFrequency += tempFrequency;
 			}
 			
 			if(i == chunkFrequencyList.size() - 1){
-				if (maxChunkSize < chunkSize) {
+				if (maxChunkSize <= chunkSize) {
 					maxChunkSize = chunkSize;
 					frequency = avgFrequency;
 				}
@@ -646,7 +668,7 @@ public class UserChannelContext implements PitchDetectionHandler {
 		}
 
 		if (maxChunkSize * 100 / chunkFrequencyList.size() < 40) {
-			return totalFrequency / chunkFrequencyList.size();
+			return chunkFrequencyList.stream().collect(Collectors.summingDouble(t -> t)) / chunkFrequencyList.size();
 		}
 
 		return frequency;