티스토리 뷰

1. alpha band와 오디오 인벨로프의 코히어런스(유사도)를 보고싶다.

 

a. 이모티브의 alpha pow 값은 8hz 단위로 들어온다

b. 오디오는 48000 단위로 샘플링 되고있다..

 

첫번째 문제는 둘의 차이가 너무 크다는것.

 

이둘을 비교하는 것 자체가 가능할까..

일단 해야할 것

다운 샘플링 업 샘플링해서 둘을 16000으로 맞춰보자..

 

두번째 문제는. 인벨로프를 어떻게 정의할 것이냐.

> 인벨로프 계산이라는 개념이 생각보다 넓은 개념이였음

> 힐버트 변환으로 계산하라는 이야기들이 많음

> 이거는 FFT 변환이 들어 갈 경우 연산량이 너무 많아짐.(역퓨리에까지 하기 때문)

 

세번째 문제는. 코히어런스 계산할때.

윈도우 사이즈. 그리고 실시간 계산이 안되니 청크사이즈를 정해서 버퍼에 담아야하는데 . 이 두개의 사이즈 조정이 생각보다 중요하고

해봐야안다.

>> 코히어런스를 1초동안 봐보자. 이러려면 chunk를 몇으로 해야하는지

fixed update를 몇 주기로 할지. 계산해야한다...

 

 

>>C#에서 RMS 기반의 amplitude envelope를 계산하는 방법

RMS

using System;
using System.Collections.Generic;

public class RMSAmplitudeEnvelope
{
    public static List<double> ComputeRmsEnvelope(float[] signal, int frameLength)
    {
        int numFrames = signal.Length / frameLength;
        List<double> rmsEnvelope = new List<double>();

        for (int i = 0; i < numFrames; i++)
        {
            int startIdx = i * frameLength;
            double sumOfSquares = 0;

            for (int j = startIdx; j < startIdx + frameLength; j++)
            {
                sumOfSquares += Math.Pow(signal[j], 2);
            }

            double meanOfSquares = sumOfSquares / frameLength;
            double rmsValue = Math.Sqrt(meanOfSquares);
            rmsEnvelope.Add(rmsValue);
        }

        return rmsEnvelope;
    }
}

이걸로 해보자 .. 


  1. 비쥬얼 스튜디오에서
  2. 프로젝트 메뉴를 클릭합니다.
  3. NuGet 패키지 관리를 선택합니다.
  4. 찾아보기 탭을 클릭합니다.
  5. 검색 상자에 NAudio를 입력합니다.
  6. NAudio 패키지를 찾아 설치 버튼을 클릭합니다.

 

업샘플링, 다운샘플링

using NAudio.Wave;
using System;
using System.Linq;

public class AudioProcessing
{
    public float[] Downsample(float[] audioData, int originalSampleRate, int targetSampleRate)
    {
        var sourceWaveFormat = new WaveFormat(originalSampleRate, 1);
        var targetWaveFormat = new WaveFormat(targetSampleRate, 1);
        var resampler = new MediaFoundationResampler(new RawSourceWaveStream(audioData, sourceWaveFormat), targetWaveFormat);

        var bytes = new List<byte>();
        var buffer = new byte[1024];
        int bytesRead;

        while ((bytesRead = resampler.Read(buffer, 0, buffer.Length)) > 0)
        {
            bytes.AddRange(buffer.Take(bytesRead));
        }

        float[] downsampledData = new float[bytes.Count / 4];
        Buffer.BlockCopy(bytes.ToArray(), 0, downsampledData, 0, bytes.Count);

        return downsampledData;
    }

    public float[] Upsample(float[] audioData, int originalSampleRate, int targetSampleRate)
    {
        int upsampleFactor = targetSampleRate / originalSampleRate;
        var upsampledData = new List<float>();

        for (int i = 0; i < audioData.Length - 1; i++)
        {
            upsampledData.Add(audioData[i]);

            for (int j = 1; j < upsampleFactor; j++)
            {
                float interpolatedValue = audioData[i] + (j / (float)upsampleFactor) * (audioData[i + 1] - audioData[i]);
                upsampledData.Add(interpolatedValue);
            }
        }

        return upsampledData.ToArray();
    }
}

 

 

 

1초동안의 코히어런스 계산을위해 chunk size, fixed update 주기 설정

>gpt 계산

더보기

unity에서 FixedUpdate의 호출 주기는 프로젝트의 Physics 설정에 따라 다릅니다. 기본적으로 이 값은 초당 50회, 즉 0.02초마다 한 번씩 호출됩니다. 이것은 FixedUpdate의 호출 빈도가 50Hz임을 의미합니다.

코히어런스를 계산하고자 하는 데이터가 16kHz 샘플 레이트로 들어온다면, FixedUpdate 내에서 1초 동안의 데이터를 처리하려면 다음과 같이 계산할 수 있습니다.

1초 동안의 데이터는 16000 샘플을 의미합니다. FixedUpdate가 50Hz로 호출된다면, 1/50초마다 FixedUpdate가 실행됩니다. 따라서 각 FixedUpdate 호출에서 처리해야 할 샘플 수는 다음과 같이 계산할 수 있습니다:

 16000/50=320
따라서 FixedUpdate에서 처리해야 할 chunkSize는 320 샘플이 되어야 합니다.

>>>처리순서

  1. 다운샘플링 (DownsampleAudio): 획득한 오디오 데이터를 목표 샘플 레이트로 다운샘플링합니다. 이 과정에서 데이터의 양을 줄이고, 필요한 처리 능력을 감소시킵니다.
  2. 인벨로프 추출 (CalculateEnvelopeRMS): 다운샘플링된 오디오 데이터로부터 RMS 인벨로프를 계산하여 오디오 신호의 파워 인벨로프를 얻습니다.
  3. 정규화 (NormalizeData): RMS 인벨로프 값을 정규화하여 모든 값이 0과 1 사이가 되도록 합니다. 이는 비교 분석을 용이하게 하고, 값의 범위를 표준화합니다.
  4. 코히어런스 계산

- 정규화 (NormalizeData)

이 함수는 입력된 data 배열의 모든 값을 0과 1 사이로 정규화합니다. 이 과정에서 각 샘플 값에서 최소값을 빼고, 그 결과를 최대값과 최소값의 차이로 나누어 줍니다.
정규화는 일반적으로 데이터의 범위를 일정하게 만들어주기 위해 사용되며, 이는 데이터 처리 과정에서 수치적 안정성을 보장하고, 다른 데이터와의 비교를 용이하게 합니다.
다운샘플링 (DownsampleAudio)

- DownsampleAudio 함수는 오디오 샘플의 수를 줄여 샘플 레이트를 감소시킵니다 (예: 48000Hz에서 16000Hz로). 이 과정에서 각 downsampleFactor번째 샘플만을 추출하여 새로운 샘플 배열을 생성합니다.
다운샘플링은 처리해야 할 데이터의 양을 줄이고, 필요한 대역폭을 감소시키며, 신호 처리에 필요한 계산량을 감소시키는데 도움을 줍니다.
인벨로프 변환 (CalculateEnvelopeRMS)

- CalculateEnvelopeRMS 함수는 주어진 samples 배열의 Root Mean Square(RMS) 값을 계산하여 신호의 파워 인벨로프를 생성합니다.
이 함수는 각 windowSize 만큼의 샘플 블록에 대하여 제곱의 평균을 구하고, 그 제곱근을 계산하여 인벨로프 배열에 저장합니다.
인벨로프는 신호의 전반적인 파워 변동을 나타내며, 오디오 신호의 리듬이나 강도 등의 특성을 분석하는 데 사용됩니다.
코히어런스 계산

- CalculateCoherence 함수는 주어진 인벨로프 신호와 알파 평균값을 사용하여 코히어런스를 계산합니다. (이 함수는 코드에 포함되어 있지 않지만, 일반적으로 두 신호 사이의 상관 관계를 계산하는 함수입니다.)
코히어런스는 두 신호 사이의 일관성이나 상관도를 나타내며, 뇌파와 오디오 신호의 동기화 정도를 분석하는 데 사용됩니다.

'기타 ... > EEG_뇌파' 카테고리의 다른 글

eeg_emotive_data_analyzer  (0) 2023.10.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함