티스토리 뷰
1. alpha band와 오디오 인벨로프의 코히어런스(유사도)를 보고싶다.
a. 이모티브의 alpha pow 값은 8hz 단위로 들어온다
b. 오디오는 48000 단위로 샘플링 되고있다..
첫번째 문제는 둘의 차이가 너무 크다는것.
이둘을 비교하는 것 자체가 가능할까..
일단 해야할 것
다운 샘플링 업 샘플링해서 둘을 16000으로 맞춰보자..
두번째 문제는. 인벨로프를 어떻게 정의할 것이냐.
> 인벨로프 계산이라는 개념이 생각보다 넓은 개념이였음
> 힐버트 변환으로 계산하라는 이야기들이 많음
> 이거는 FFT 변환이 들어 갈 경우 연산량이 너무 많아짐.(역퓨리에까지 하기 때문)
세번째 문제는. 코히어런스 계산할때.
윈도우 사이즈. 그리고 실시간 계산이 안되니 청크사이즈를 정해서 버퍼에 담아야하는데 . 이 두개의 사이즈 조정이 생각보다 중요하고
해봐야안다.
>> 코히어런스를 1초동안 봐보자. 이러려면 chunk를 몇으로 해야하는지
fixed update를 몇 주기로 할지. 계산해야한다...
>>C#에서 RMS 기반의 amplitude envelope를 계산하는 방법
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;
}
}
이걸로 해보자 ..
- 비쥬얼 스튜디오에서
- 프로젝트 메뉴를 클릭합니다.
- NuGet 패키지 관리를 선택합니다.
- 찾아보기 탭을 클릭합니다.
- 검색 상자에 NAudio를 입력합니다.
- 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 샘플이 되어야 합니다.
>>>처리순서
- 다운샘플링 (DownsampleAudio): 획득한 오디오 데이터를 목표 샘플 레이트로 다운샘플링합니다. 이 과정에서 데이터의 양을 줄이고, 필요한 처리 능력을 감소시킵니다.
- 인벨로프 추출 (CalculateEnvelopeRMS): 다운샘플링된 오디오 데이터로부터 RMS 인벨로프를 계산하여 오디오 신호의 파워 인벨로프를 얻습니다.
- 정규화 (NormalizeData): RMS 인벨로프 값을 정규화하여 모든 값이 0과 1 사이가 되도록 합니다. 이는 비교 분석을 용이하게 하고, 값의 범위를 표준화합니다.
- 코히어런스 계산
- 정규화 (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
- Python
- unity 360
- sequelize
- 라즈베리파이
- colab
- Arduino
- 유니티플러그인
- StableDiffusion
- Unity
- AI
- JacobianMatrices
- oculuspro
- MQTT
- Express
- ardity
- node.js
- TouchDesigner
- houdini
- VR
- DeepLeaning
- docker
- motor controll
- three.js
- Java
- RNN
- 유니티
- CNC
- opencv
- 후디니
- emotive eeg
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |