|
일일 결과물 | |||
이 름 |
유 진명 |
일 시 |
2010-10-20 |
소요시간 |
6 시간 |
|
|
주 제 명 |
특정 음성신호에 대한 표준편차, 분산 그리고 특정시간 신호 분석 |
Form 인터페이스
특정 음성 신호에 대한 편차 구하기
분석 시작을 하게 되면 분석 하고자 하는 파일을 선택하게 되면 주파수의 평균. 분산, 표준 편차를 출력하게 된다.
다음의 프로그램 코드는 MyAnalysis 클래스로 신호에 대한 분석을 한다.
class MyAnalysis { int size; short[] datas = null; public MyAnalysis(int _size, short[] _datas) { size = _size; datas = _datas; } public double Avg() { double result = 0.0; result = Sum() / size; return result; } private long Sum() { long result = 0; int i = 0; for (i = 0; i < size; i++) { result = result + Math.Abs(datas[i]); } return result; } public short[] Deviation() { double avg = Avg(); short[] devdatas = new short[size]; int i = 0; for (i = 0; i < size; i++) { devdatas[i] = (short)(datas[i] - avg); }
return devdatas; } public int Variance() { long total = 0; short[] devdatas = new short[size]; devdatas = Deviation();
int i; for (i = 0; i < size; i++) { total += (long)Math.Pow(devdatas[i], 2); } return (int)total / size; } public double Stdev() { int var = 0; var = Variance(); return Math.Sqrt(var); } } |
설명 : MyAnalysis 클래스를 생성할 때 분석하고자 하는 신호의 원본과 크기를 전달한다. 그리고 신호 크기의 총 합계, 합계에 대한 평균, 편차, 표준 편차, 분산을 구하게 된다.
편차는 원본데이터 – 데이터들의 평균 으로 구할 수 있다.
분산은 편차^2의 합 / 총 크기로 구한다.
표준 편차는
분석 시작 버튼을 누르면 파일을 열면 주파수 신호의 데이터를 short 배열에 저장하게 된다. 이 신호를 MyAnalysis 클래스로 전달하여 분석 한 결과를 Form에 출력하게 된다.
private void b_average_Click(object sender, EventArgs e) { SoundInfo sf = null; OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "wav files (*.wav)|*.wav|All files(*.*)|*.*"; ofd.FilterIndex = 1; ofd.RestoreDirectory = true; ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK) { if (ofd.FileName != null) { sf = SoundInfo.CreateInstance(ofd.FileName); int dsize = sf.DataChunk.Size / 2; short[] datas = new short[dsize]; int i = 0; for (i = 0; i < dsize; i++) { datas[i] = sf.DataChunk[i]; } MyAnalysis ma = new MyAnalysis(dsize, datas);
t_average.Text = ma.Avg().ToString(); t_variance.Text = ma.Variance().ToString(); t_stdev.Text = ma.Stdev().ToString(); } } } |
실행 결과는 다음과 같다.
다음은 원하는 시간 구간에 대한 신호 그래프를 분석할 수 있도록 다른 Form에 출력하는 코드이다.
먼저 Wave 재생 그룹에서 파일을 열고 재생을 누르면 구간 분석 그룹의 시간 TextBox에 재생한 Wav 파일에 총 시간을 출력하게 된다.
총 시간은 다음과 같은 식으로 구하면 된다.
(FileSize/(Bps X Channel X Samplete))/8 = 전체 시간
위의 식을 적용시켜 아래의 코드를 작성하여 총 시간을 구하였다.
string buf = string.Format("0 ~ " + (sw.Chunkhead.Size / (double)((sw.SubChunk.Bps * sw.SubChunk.NChannels * sw.SubChunk.Samplerate / 8))).ToString()); t_time.Text = buf; |
출력된 총 시간 범위 안에서 출력하고자 하는 시간의 구간을 입력하고 구간 분석 버튼을 누르게 되면 AnalForm으로 해당 구간 데이터와 크기를 넘기게 된다. 그리고 새로운 form에 그래프를 출력하게 된다.
다음은 Main Form에서 입력한 시간 구간에 대한 데이터를 얻어 새로운 Form을 생성하는 코드이다.
private void button1_Click(object sender, EventArgs e) { int idx = 0; double spos = double.Parse(t_startpos.Text) * size / 2; if (spos == 0) spos = 0.01; double epos = double.Parse(t_endpos.Text) * size / 2; short[] adatas = new short[(int)(epos - spos)];
if (datas != null) { for (int i = (int)spos; i < epos - 1; i++) { adatas[idx] = datas[i]; idx++; } AnalForm af = new AnalForm(adatas, idx); af.Show(); } } |
다음은 Main Form에서 넘겨받은 데이터를 그래프로 출력하는 코드와 실행 화면 이다.
public partial class AnalForm : Form { short[] datas = null; int size = 0; public AnalForm(short[] _datas, int _size) { InitializeComponent(); datas = _datas; size = _size; }
private void AnalForm_Paint(object sender, PaintEventArgs e) { Pen pen = Pens.Blue; int i = 0; Graphics g = e.Graphics; Point op = new Point(0, 150 + datas[0] / 200); Point np; for (i = 1; i < size / 2; i++) { np = new Point(i / 64, 150 + datas[i] / 200); g.DrawLine(pen, op, np); op = np; } } } |
앞으로 할 일 : 그래프를 그렸으니 그려진 그래프에 대한 분석 (평균, 편차, 분산, 표준편차)을 하여 출력 할 것이다. 그리고 구간별 차이를 구해 평균 주파수 차이가 어느 정도(ex. 10 )이상 차이 나는 곳에 마크를 삽입하도록 구현 할 것이다.
첫댓글 FileSize/((Bps X Channel X Samplete)/8) = 전체 시간