Я использую NAudio BiQuadFilter для воспроизведения файлов Wav.Я хочу устранить «статический» фоновый шум, эти низкие грохочущие звуки, которые не являются человеческой речью.Я создал цепочку DSP, которая проходит через BiQuadFilter.Я использовал фильтр с различными коэффициентами усиления и частотами, оставляя полосу пропускания постоянной.Я могу понизить статику, но голос тоже понизится.Как я могу изолировать только статический шум, не влияя на человеческий голос.Если бы вы могли просто указать мне правильное направление, это было бы здорово!(Я потерял день, исследуя это.)
Я создал 8 полос и установил частоты равными 100, 300, 400, 500, 800, 1200, 4800, 9600;Установите усиление на значения, такие как -6 до -100;держал пропускную способность на 0,8.
Я также попытался использовать только 1 полосу и нацелиться на конкретную частоту, например 1300, с коэффициентом усиления -30.
Bands = {New EqualizerBand(), New EqualizerBand(), New EqualizerBand(),
New EqualizerBand(), New EqualizerBand(), New
EqualizerBand(), New EqualizerBand(), New EqualizerBand()}
Bands(0).Bandwidth = 0.8F
Bands(0).Gain = -6
Bands(0).Frequency = 100
Bands(1).Bandwidth = 0.8F
Bands(1).Gain = -6
Bands(1).Frequency = 300
Bands(2).Bandwidth = 0.8F
Bands(2).Gain = -6
Bands(2).Frequency = 400
Bands(3).Bandwidth = 0.8F
Bands(3).Gain = -6
Bands(3).Frequency = 500
Bands(4).Bandwidth = 0.8F
Bands(4).Gain = -6
Bands(4).Frequency = 800
Bands(5).Bandwidth = 0.8F
Bands(5).Gain = -6
Bands(5).Frequency = 1200
Bands(6).Bandwidth = 0.8F
Bands(6).Gain = -6
Bands(6).Frequency = 4800
Bands(7).Bandwidth = 0.8F
Bands(7).Gain = -6
Bands(7).Frequency = 9600
AudioFileReader1 = New AudioFileReader(Me.FilePath)
Equalizer1 = New EqualizerClass(AudioFileReader1, Bands)
SpeedControl = New VarispeedSampleProvider(Equalizer1, 100, New
SoundTouchProfile(False, False))
SpeedControl.PlaybackRate = 1
VolumeSampleProvider1 = New VolumeSampleProvider(SpeedControl)
Here's the ISampleProvider, which is from this example: https://github.com/naudio/NAudio/tree/master/NAudioWpfDemo/EqualizationDemo
namespace Equalizer
{
/// <summary>
/// Basic example of a multi-band eq
/// uses the same settings for both channels in stereo audio
/// Call Update after you've updated the bands
/// Potentially to be added to NAudio in a future version
/// </summary>
public class EqualizerClass : ISampleProvider
{
private readonly ISampleProvider sourceProvider;
private readonly EqualizerBand[] bands;
private readonly BiQuadFilter[,] filters;
private readonly int channels;
private readonly int bandCount;
private bool updated;
public EqualizerClass(ISampleProvider sourceProvider, EqualizerBand[] bands)
{
this.sourceProvider = sourceProvider;
this.bands = bands;
channels = sourceProvider.WaveFormat.Channels;
bandCount = bands.Length;
filters = new BiQuadFilter[channels, bands.Length];
CreateFilters();
}
private void CreateFilters()
{
for (int bandIndex = 0; bandIndex < bandCount; bandIndex++)
{
var band = bands[bandIndex];
for (int n = 0; n < channels; n++)
{
if (filters[n, bandIndex] == null)
filters[n, bandIndex] = BiQuadFilter.PeakingEQ(sourceProvider.WaveFormat.SampleRate, band.Frequency, band.Bandwidth, band.Gain);
else
filters[n, bandIndex].SetPeakingEq(sourceProvider.WaveFormat.SampleRate, band.Frequency, band.Bandwidth, band.Gain);
}
}
}
public void Update()
{
updated = true;
CreateFilters();
}
public WaveFormat WaveFormat => sourceProvider.WaveFormat;
public int Read(float[] buffer, int offset, int count)
{
int samplesRead = sourceProvider.Read(buffer, offset, count);
if (updated)
{
CreateFilters();
updated = false;
}
for (int n = 0; n < samplesRead; n++)
{
int ch = n % channels;
for (int band = 0; band < bandCount; band++)
{
buffer[offset + n] = filters[ch, band].Transform(buffer[offset + n]);
}
}
return samplesRead;
}
}
}
Я ожидаю, что при устранении более низких частотных диапазонов (100-500), я должен избавиться от «статического» фонового шума и все равно слышать голос пользователя.Что на самом деле происходит, так это то, что голос и «статический» фоновый шум снижены.