问题描述
我有一个侦听器类,用于监听麦克风输入:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Spectrogram.MicrophoneDemo
{
public class Listener : IDisposable
{
public readonly int SampleRate;
private readonly NAudio.Wave.WaveInEvent wvin;
public double AmplitudeFrac { get; private set; }
public double TotalSamples { get; private set; }
public double TotalTimeSec { get { return (double)TotalSamples / SampleRate; } }
private readonly List<double> audio = new List<double>();
public int SamplesInMemory { get { return audio.Count; } }
public Listener(int deviceIndex,int sampleRate)
{
SampleRate = sampleRate;
wvin = new NAudio.Wave.WaveInEvent
{
DeviceNumber = deviceIndex,WaveFormat = new NAudio.Wave.WaveFormat(sampleRate,bits: 16,channels: 1),BufferMilliseconds = 20
};
wvin.DataAvailable += OnNewAudioData;
wvin.StartRecording();
}
public void Dispose()
{
wvin?.StopRecording();
wvin?.Dispose();
}
private void OnNewAudioData(object sender,NAudio.Wave.WaveInEventArgs args)
{
int bytesPerSample = wvin.WaveFormat.BitsPerSample / 8;
int newSampleCount = args.BytesRecorded / bytesPerSample;
double[] buffer = new double[newSampleCount];
double peak = 0;
for (int i = 0; i < newSampleCount; i++)
{
buffer[i] = BitConverter.ToInt16(args.Buffer,i * bytesPerSample);
peak = Math.Max(peak,buffer[i]);
}
lock (audio)
{
audio.AddRange(buffer);
}
AmplitudeFrac = peak / (1 << 15);
TotalSamples += newSampleCount;
}
public double[] GetNewAudio()
{
lock (audio)
{
double[] values = new double[audio.Count];
for (int i = 0; i < values.Length; i++)
values[i] = audio[i];
audio.RemoveRange(0,values.Length);
return values;
}
}
}
}
我的下一步是遍历样本并收集莫尔斯电码“ dit”和“ dat”。
我以前从未使用过音频数据,只想知道 如何使用样本数据实现对莫尔斯电码的解码?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)