使用C#NAudio从Mic Input解码摩尔斯现场

问题描述

我有一个侦听器类,用于监听麦克风输入:

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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...