Zdravím.
Zadání: http://www.youtube.com/watch?v=fpwuqDVwcsM&feature=player_embedded
Přílohy: http://czshare.com/2855804/P%C5%99%C3%ADlohy.zip
Postup:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
AnalyzerThread analyze = new AnalyzerThread();
Recorder rec = new Recorder();
public Form1()
{
InitializeComponent();
//změna rozsahu osy X1
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisX.Maximum = 2000;
//změna rozsahu osy Y1
chart1.ChartAreas[0].AxisY.Minimum = -1;
chart1.ChartAreas[0].AxisY.Maximum = 1;
//změna rozsahu osy X2
chart2.ChartAreas[0].AxisX.Minimum = 0;
chart2.ChartAreas[0].AxisX.Maximum = 500;
//změna rozsahu osy Y2
chart2.ChartAreas[0].AxisY.Minimum = 0;
chart2.ChartAreas[0].AxisY.Maximum = 0.6;
}
//graf pro vykreslení zvuku v časové oblasti
public void vykresli(LinkedList<float> samples_measured)
{
foreach (float sample in samples_measured)
{
if (chart1.Series[0].Points.Count > 1000) // ptám se, zda-li řada vzorků neobsahuje více než 1000 vzorků, které chci zobrazit na ose X
chart1.Series[0].Points.RemoveAt(0); // odstranění vzorku z řady
chart1.Series[0].Points.AddY(sample); // přidávání dat do grafu
}
analyze.AddSamples(samples_measured.ToArray());
}
//graf pro vykreslení frekvenčního spektra
private double step_WK;
public void vykresli_fft(double[] samples_fft) // přichází pole s oboustranným FFT spektrem, proto níže /2 (stačí pouze jednostranné spektrum)
{
if (chart2.InvokeRequired) // zde se ptám, jestli je graf pro FFT volán z jiného vlákna, podmínka platí, když metodu volám z jiného vlákna
{
FFTSamplesProcessed new_handler = new FFTSamplesProcessed(vykresli_fft); // vytvářím nový objekt stejného typu, jak je událost, kde mám vypoč. FFT
this.Invoke(new_handler, new object[] { samples_fft }); // zde do nového objektu dám data, které posílá druhé vlákno a současně vyvolávám tuto metodu na vlákně, na kterém běží vykreslování
}
else
{
chart2.Series[0].Points.Clear(); // vymazání grafu
for (int i = 0; i < (samples_fft.Length / 2); i++)
{
chart2.Series[0].Points.AddXY((i * step_WK), samples_fft[i]); // vykreslování po bodech
}
}
}
//tlačítko pro uzavření aplikace
bool appRunning = false;
private void button1_Click(object sender, EventArgs e)
{
if (appRunning)
rec.StopRecording();
if (analyze.IsAnalyzerRunning)
analyze.Stop();
Application.Exit();
}
//tlačítko pro zastavení nahrávání
private void button2_Click(object sender, EventArgs e)
{
button2.Enabled = !button2.Enabled;
button3.Enabled = true;
chart1.Enabled = false;
}
//tlačítko pro spouštění nahrávání
private void button3_Click(object sender, EventArgs e)
{
button3.Enabled = !button3.Enabled;
button2.Enabled = true;
chart1.Enabled = true;
}
//tlačítko pro FFT
private void button4_Click(object sender, EventArgs e)
{
if (button4.Text == "START")
{
analyze.Start();
button4.Text = "STOP";
}
else
{
analyze.Stop();
button4.Text = "START";
}
}
//vybrané zařízení
private int mic_id = 0;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.mic_id = comboBox1.SelectedIndex;
}
//nastavení limitu
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
numericUpDown1.Maximum = 100;
numericUpDown1.Minimum = 0;
}
//zisk
private void progressBar1_Click(object sender, EventArgs e)
{
}
//napěťová špička
private void label1_Click(object sender, EventArgs e)
{
}
}
}
P.S.: funkčnost 0!