Окно Хэмминга генерирует линию

У меня есть аудиофайл и я читаю все данные из буфера звуковой карты. Затем я конвертирую byte[] в float[] использовать их для окна Хэмминга. Форма волны аудио:

https://stackru.com/images/ccf9cb835c964bbb58169bc38f816a9bfa67ddae.png

после использования окна Хемминга:

https://stackru.com/images/69c354c7cdc62ae415a0e3df96587572f22a5040.png

форма волны аудио с окном Хэмминга не так ли? Где моя ошибка?

кстати я использую библиотеку naudio для обработки аудио:

WaveChannel32 wave = new WaveChannel32(new WaveFileReader("sesDosyası.wav"));
byte []buffer = new byte[wave.length];
float []data = new float[wave.length / 4];
int read = wave.Read(buffer, 0, wave.length);
for (int i = 0; i < read / 4; i++)
{   
    data[i] = BitConverter.ToSingle(buffer, i * 4); //converting byte to float
    chart1.Series["wave"].Points.Add(data[i]); //first waveform
}

for (int j = 0; j < read/4; j++)
{
   data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (read / 4 - 1)));//hamming
   chart2.Series["wave"].Points.Add(data[j]); //second waveform
}

2 ответа

Решение

Похоже, вы применяете окно ко всей волне, поэтому read будет огромным, поэтому термин внутри cos всегда будет очень близко к 0 для data между [-1,1].

Таким образом, вы всегда получаете .54 - .46*cos(0) знак равно .54 - .46*1.0 знак равно .08

Только из википедииj должен быть внутри косинуса - это дает окно, которое вы затем умножаете на data[j]:

window =  0.54 - 0.46 * Math.Cos( (2*Math.PI * j)/(total - 1) ).
hammed_signal = data[j]*window;

Почему вы пытаетесь применить окно Хэмминга ко всей волне?

Я думаю, что ваша линия Хэмминга не так

data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (read - 1)));

Как ваша петля идет от 0 в read/4и вы делитесь на read, так что если вы прочитали 16 образцов, ваш цикл for просматривает только первые 4, но делит на 15, а не на 3.

var total = read / 4;

for (int j = 0; j < total; j++)
{
   data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (total- 1)));//hamming
   chart2.Series["wave"].Points.Add(data[j]); //second waveform
}
Другие вопросы по тегам