【问题标题】:Implementing a High Pass filter to an audio signal对音频信号实施高通滤波器
【发布时间】:2015-04-02 05:11:16
【问题描述】:

我能够编写一个程序来捕获音频信号、消除背景噪音、应用窗口函数和可视化该信号。我的程序运行到现在没有错误。现在我正在尝试对我的代码实施高通滤波器。我已经找到了这部分的 API。但我无法根据我的代码应用它。这是我的代码:

private class RecordAudio extends AsyncTask<Void, double[], Void> {
    @Override
    protected Void doInBackground(Void... params) {
        started = true;
        try {
            DataOutputStream dos = new DataOutputStream(
                    new BufferedOutputStream(new FileOutputStream(
                            recordingFile)));
            int bufferSize = AudioRecord.getMinBufferSize(frequency,
                    channelConfiguration, audioEncoding);
            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    frequency, channelConfiguration, audioEncoding,
                    bufferSize);

            NoiseSuppressor.create(audioRecord.getAudioSessionId());
            short[] buffer = new short[blockSize];
            double[] toTransform = new double[blockSize];
            long t = System.currentTimeMillis();
            long end = t + 15000;
            audioRecord.startRecording();

            while (started && System.currentTimeMillis() < end) {
                int bufferReadResult = audioRecord.read(buffer, 0,
                        blockSize);
                for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                    toTransform[i] = (double) buffer[i] / 32768.0;
                    dos.writeShort(buffer[i]);
                }
                toTransform = hann(toTransform);
                transformer.ft(toTransform);
                publishProgress(toTransform);
            } 
            audioRecord.stop();
            dos.close();
        } catch (Throwable t) {
            Log.e("AudioRecord", "Recording Failed");
        }
        return null;
    }

This 是 API 链接。

谁能帮我做这个功能?我真的很感激! :)

提前致谢!

【问题讨论】:

  • 您在 3 天前提出了 [同样的问题][1]。 [1]:stackoverflow.com/questions/28252665/…
  • @Jens 是的。我再次发布它,因为它没有帮助我。无论如何,昨天晚上我能够实现高通滤波器功能。那我需要做什么??我需要关闭这个问题吗?因为我是 stackoverflow 的新手。
  • 通常您会在对第一个问题的回复中添加评论,说明为什么回复没有回答您的问题。也许改写(编辑)您的原始问题以提高可读性。请记住,StackOverflow 用户在提出这些问题后很长一段时间都会继续阅读这些问题。
  • 好的,谢谢 Jens ......干杯! ....:)

标签: java android signal-processing highpass-filter


【解决方案1】:

这是我从 c# 中找到的库转换为 java 的类。我使用它,它工作得很好。您也可以将此类用于低通滤波器

public class Filter {


/// <summary>
/// rez amount, from sqrt(2) to ~ 0.1
/// </summary>
private float resonance;

private float frequency;
private int sampleRate;
private PassType passType;


public float value;

private float c, a1, a2, a3, b1, b2;

/// <summary>
/// Array of input values, latest are in front
/// </summary>
private float[] inputHistory = new float[2];

/// <summary>
/// Array of output values, latest are in front
/// </summary>
private float[] outputHistory = new float[3];

public Filter(float frequency, int sampleRate, PassType passType, float resonance)
{
    this.resonance = resonance;
    this.frequency = frequency;
    this.sampleRate = sampleRate;
    this.passType = passType;

    switch (passType)
    {
        case Lowpass:
            c = 1.0f / (float)Math.tan(Math.PI * frequency / sampleRate);
            a1 = 1.0f / (1.0f + resonance * c + c * c);
            a2 = 2f * a1;
            a3 = a1;
            b1 = 2.0f * (1.0f - c * c) * a1;
            b2 = (1.0f - resonance * c + c * c) * a1;
            break;
        case Highpass:
            c = (float)Math.tan(Math.PI * frequency / sampleRate);
            a1 = 1.0f / (1.0f + resonance * c + c * c);
            a2 = -2f * a1;
            a3 = a1;
            b1 = 2.0f * (c * c - 1.0f) * a1;
            b2 = (1.0f - resonance * c + c * c) * a1;
            break;
    }
}

public enum PassType
{
    Highpass,
    Lowpass,
}

public void Update(float newInput)
{
    float newOutput = a1 * newInput + a2 * this.inputHistory[0] + a3 * this.inputHistory[1] - b1 * this.outputHistory[0] - b2 * this.outputHistory[1];

    this.inputHistory[1] = this.inputHistory[0];
    this.inputHistory[0] = newInput;

    this.outputHistory[2] = this.outputHistory[1];
    this.outputHistory[1] = this.outputHistory[0];
    this.outputHistory[0] = newOutput;
}


public float getValue()
{
    return this.outputHistory[0];
}


}

这就是我使用它的方式

    Filter filter = new Filter(15000,44100, Filter.PassType.Highpass,1);
    for (int i = 0; i < numSamples; i++)
    {
        filter.Update(floatArray[i]);
        floatArray[i] = filter.getValue();
    }

在你得到 floatArray 的 fft 之后,你会看到它被过滤了。 希望对你有帮助

【讨论】:

  • 它正在工作,但我们如何适应 ECG 呢?任何想法
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 2015-08-04
  • 2012-09-22
  • 2014-03-20
  • 2021-07-20
  • 2019-07-02
  • 2016-02-20
  • 1970-01-01
相关资源
最近更新 更多