如何提高声卡上文件传输的比特率

本文关键字:传输 比特率 文件 何提高 声卡 | 更新日期: 2023-09-27 18:11:45

我需要只使用声卡传输文件。

我的算法到目前为止是基于幅度移位键控(ASK)。

发射机:
程序将调制后的数据写入WAV文件。
当位为1时,只需写"噪声"(创建波),否则写"沉默"(0振幅)。
沉默和噪声的样本数量是预先定义的,并且在这两种情况下都是相等的。

接收机:
程序开始记录并等待高于预先定义的噪声阈值的样本。
一旦检测到噪声,它将记录的样本解调为WAV文件,直到检测到"结束信号"。

协议:

  1. 第一个字节是255,不是数据的一部分(通知接收方一个新文件)。
  2. 然后写入数据(文件内容)
  3. 写入4个预定义字节,表示会话结束。
  4. 每个比特传输3次,因此如果出现错误,它可以由其他两个(ECC)猜测正确的比特。

我正在使用NAudio c#库来处理WAV文件(记录,播放,写入,读取)。

为了更好地理解,我在下面添加了一些我的代码,但在我看来,你可以省去自己的麻烦,我只想知道算法中的缺陷以及如何改进它。

发射机:

//creates file with 44.1kHz sample-rate and 1 channel.
mWaveFileWriter = new WaveFileWriter(tempFile, new WaveFormat(44100, 1));
....
// save to WAV file modulated data the contains bytesData
public void Modulate(byte[] bytesData)
{
    foreach (var dataByte in bytesData)
    {
         // return 8 bit representation of the byte
         bool[] binaryByte = ToBinary(dataByte);
         foreach (bool bit in binaryByte)
         {
             if (bit)
                SaveNoise();
             else
                SaveSilence();
         }
         mWaveFileWriter.Dispose();
    }
}
private void SaveSilence()
{
    for (int n = 0; n < mSamplesPerBit; n++)
    {
        mWaveFileWriter.WriteSample(0);
    }
}
private void SaveNoise()
{
    // writes SamplesPerBit samples
    for (int n = 0; n < mSamplesPerBit; n++)
    {
        float sample = (float)(mNoiseAmplitude * Math.Sin((2 * Math.PI * n * mFrequency) / mWaveFileWriter.WaveFormat.SampleRate));
        mWaveFileWriter.WriteSample(sample);
    }
 }

当我有这个文件后,它被播放一次:

System.Media.SoundPlayer player = new System.Media.SoundPlayer(tempFile);
player.Play();

接收机:

WaveInEvent mWaveIn = new WaveInEvent();
mWaveIn.WaveFormat = new WaveFormat(44100, 1);
mWaveIn.DataAvailable += mWaveIn_DataAvailable;
....
void mWaveIn_DataAvailable(object sender, WaveInEventArgs e)
{
    // since it's 16bit sampling, I normalize each 2 bytes to samples of range (-1.0f) - 1.0f.
    float[] samples = ToSamples(e.Buffer);
    ...   // saves data, process it etc...
}

我没有写全部,但基本上接收器寻找8 * SamplesPerBit噪声样本。(它通过将样本与噪声阈值进行比较来确定样本是否有噪声)。然后保存所有其他数据,直到它检测到结束信号。最后,它将内容保存到一个文件中。

问题是,为了使其正常工作,我需要SamplesPerBit至少为100。由于每秒有44100个采样,因此每秒写入约441位。
由于我的数据是原来的三倍,所以总的来说,它小于20字节/秒。

我需要能够以至少1KB/秒的速度传输数据。

关于如何提高比特率的任何建议都将非常有帮助。

我想用FSK(振幅保持不变,频率变化),用Naudio中的FastFourierTransform类,但我不认为这样会更快(可能更少出错)。

如何提高声卡上文件传输的比特率

方法的问题

  • 过长的静音或过长的噪声会导致流去同步
  • 例如传输100MB的零,最后解码的比特数可以不同
  • 这可以通过偶尔的同步信号来修复
  • 你使用不容易正确检测的噪声(因此传输速度慢)
  • 在音频硬件上,沿途有电容器,因此直流信号被破坏
  • 所以代码使用直流信号是没有问题的,但还有很多其他的,所以…

如果你没有被绑定到ASK,那么还有许多其他的编码可能会更好:

  1. 调频

    • 例如0将为22050Hz, 1将为44100Hz
    • 每个比特可以编码成几个周期(至少2个)
    • 还需要一些定时同步信号(例如11025Hz,每分钟10周期一次)
  2. PCM
    • 例如4个44100Hz脉冲为1
    • 2个44100hz脉冲为0
    • 和所有位
    • 之间的2个沉默周期
    • 不需要任何额外的同步信号

你也可以添加开始信号

  • 一些不同的频率和精确的暂停在它之后的数据
  • 也可以在data
  • 之前添加一些标题
  • 让接收器知道需要多少数据
  • 或者如果你想进行实验,使用哪个编码
(笔记)

  • 你可以尝试脉冲计数或频率
  • 我给你设置是快速的,仍然应该工作
  • 但是你应该测试错误率并配置它以匹配你的HW设置…
  • 至少需要2个周期才能安全地识别频率。