C# 如何实现低通滤波器 运行 的以下代码?
C# How does the following code for Low Pass Filter run?
我在 NAudio 网站上找到了以下用于低通滤波器的 C# 代码:
public void setValues(ISampleProvider sourceProvider,int cutOffFreq)
{
this.sourceProvider = sourceProvider;
this.cutOffFreq = cutOffFreq;
filter_LowPass();
}
private void filter_LowPass()
{
channels = sourceProvider.WaveFormat.Channels;
filters = new BiQuadFilter[channels];
for (int n = 0; n < channels; n++)
if (filters[n] == null)
filters[n] = BiQuadFilter.LowPassFilter(44100, cutOffFreq, 1);
else
filters[n].SetLowPassFilter(44100, cutOffFreq, 1);
}
public WaveFormat WaveFormat { get { return sourceProvider.WaveFormat; } }
public int Read(float[] buffer, int offset, int count)
{
int samplesRead = sourceProvider.Read(buffer, offset, count);
for (int i = 0; i < samplesRead; i++)
buffer[offset + i] = filters[(i % channels)].Transform(buffer[offset + i]);
return samplesRead;
}
我的读取函数在哪里被调用?
为什么我需要它?
我这样调用函数filter_LowPass:
myFilter.setValues(audioFileReader, currentCutOff);
waveOut.Init(myFilter);
如果我想在每个样本通过低通滤波器后将其乘以一个常数值,我应该在哪里编写代码?
NAudio 在这里使用拉模式。 waveOut
将被声卡要求采样,因此它将向上游调用 myFilter.Read()
,后者又将调用 audioFileReader.Read()
。
如果您想增加一些额外的收益,您可以按照相同的模式创建一个新的 ISampleProvider 或将其内联到低通滤波器的读取函数中:
public int Read(float[] buffer, int offset, int count)
{
int samplesRead = sourceProvider.Read(buffer, offset, count);
for (int i = 0; i < samplesRead; i++)
buffer[offset + i] = gain * filters[(i % channels)].Transform(buffer[offset + i]);
// ^^^^
return samplesRead;
}
我在 NAudio 网站上找到了以下用于低通滤波器的 C# 代码:
public void setValues(ISampleProvider sourceProvider,int cutOffFreq)
{
this.sourceProvider = sourceProvider;
this.cutOffFreq = cutOffFreq;
filter_LowPass();
}
private void filter_LowPass()
{
channels = sourceProvider.WaveFormat.Channels;
filters = new BiQuadFilter[channels];
for (int n = 0; n < channels; n++)
if (filters[n] == null)
filters[n] = BiQuadFilter.LowPassFilter(44100, cutOffFreq, 1);
else
filters[n].SetLowPassFilter(44100, cutOffFreq, 1);
}
public WaveFormat WaveFormat { get { return sourceProvider.WaveFormat; } }
public int Read(float[] buffer, int offset, int count)
{
int samplesRead = sourceProvider.Read(buffer, offset, count);
for (int i = 0; i < samplesRead; i++)
buffer[offset + i] = filters[(i % channels)].Transform(buffer[offset + i]);
return samplesRead;
}
我的读取函数在哪里被调用?
为什么我需要它?
我这样调用函数filter_LowPass:
myFilter.setValues(audioFileReader, currentCutOff);
waveOut.Init(myFilter);
如果我想在每个样本通过低通滤波器后将其乘以一个常数值,我应该在哪里编写代码?
NAudio 在这里使用拉模式。 waveOut
将被声卡要求采样,因此它将向上游调用 myFilter.Read()
,后者又将调用 audioFileReader.Read()
。
如果您想增加一些额外的收益,您可以按照相同的模式创建一个新的 ISampleProvider 或将其内联到低通滤波器的读取函数中:
public int Read(float[] buffer, int offset, int count)
{
int samplesRead = sourceProvider.Read(buffer, offset, count);
for (int i = 0; i < samplesRead; i++)
buffer[offset + i] = gain * filters[(i % channels)].Transform(buffer[offset + i]);
// ^^^^
return samplesRead;
}