【wpf】正弦波余弦波の波形データをCSVファイルに出力する
CSVファイル出力
まずは、どのような結果になるか示します。
CSVファイル内容
ソースコードの紹介
xamlソースコードとcsソースコードを下記に示します。
MainWindow.xaml
csv出力用のボタンを配置する。
<Window x:Class="WpfChartTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfChartTest"
xmlns:sparrow="http://sparrowtoolkit.codeplex.com/wpf"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid Margin="0,0,2,0">
<!--全体のGrid設定-->
<Grid.RowDefinitions>
<!--行設定-->
<RowDefinition Height="1*" />
<RowDefinition Height="9*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<!--列設定-->
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0" Grid.Row="0" Background="WhiteSmoke" >
<Button x:Name="output_btn" Content="CSV出力" Click="Output_btn_Click"/>
</Grid>
<Grid Grid.Column="0" Grid.Row="1" Background="WhiteSmoke" >
<sparrow:SparrowChart Visibility="Visible" VerticalAlignment="Top" Height="367" >
<sparrow:SparrowChart.XAxis>
<sparrow:LinearXAxis x:Name="line_x" MinValue="0" MaxValue="1" Visibility="Visible"/>
</sparrow:SparrowChart.XAxis>
<sparrow:SparrowChart.YAxis>
<sparrow:LinearYAxis x:Name="line_y" MinValue="0" MaxValue="1" Visibility="Visible"/>
</sparrow:SparrowChart.YAxis>
<sparrow:LineSeries PointsSource="{Binding Path=Points_sin_a}" XPath="X" YPath="Y"/>
<sparrow:LineSeries PointsSource="{Binding Path=Points_cos_a}" XPath="X" YPath="Y"/>
</sparrow:SparrowChart>
</Grid>
</Grid>
</Window>
MainWindow.xaml.cs
CSV出力ボタンがクリックされたときの処理をClickイベントハンドラーに書いていく。
using Microsoft.Win32;
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Windows;
namespace WpfChartTest
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public ObservableCollection<Point> Points_sin_a { get; set; }
public ObservableCollection<Point> Points_cos_a { get; set; }
public double fs = 1280; //サンプリング周波数
public double freq = 50; //周波数
public double size = 128; //データ数
//データ出力用
public double[] sindata_res;
public double[] cosdata_res;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//グラフ
Points_sin_a = new ObservableCollection<Point>();
Points_cos_a = new ObservableCollection<Point>();
double[] data_a = new double[(int)size];
double[] data_b = new double[(int)size];
//csv出力用
sindata_res = new double[(int)size];
cosdata_res = new double[(int)size];
// 波形生成
for (int i = 0; i < size; i++)
{
double t = (double)i / fs; //time
// f(t) = a*sin(2πft)
data_a[i] = 0.3 * Math.Sin(2 * Math.PI * freq * t);
data_b[i] = 0.3 * Math.Cos(2 * Math.PI * freq * t);
//グラフ要素にデータ挿入
Points_sin_a.Add(new Point { X = i, Y = data_a[i] });
Points_cos_a.Add(new Point { X = i, Y = data_b[i] });
//csv出力用
sindata_res[i] = data_a[i];
cosdata_res[i] = data_b[i];
}
this.DataContext = this; //波形プロット
//グラフ軸の表示範囲設定
line_x.MinValue = 0; //X軸の最小値
line_x.MaxValue = size; //X軸の最大値
line_y.MinValue = -0.3; //Y軸の最小値
line_y.MaxValue = 0.3; //Y軸の最大値
//line_y.MinValue = data_a.Min(); //Y軸の最小値 データ内の最小振幅値で可変
//line_y.MaxValue = data_a.Max(); //Y軸の最大値 データ内の最大振幅値で可変
}
/// <summary>
/// CSVファイル出力
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Output_btn_Click(object sender, RoutedEventArgs e)
{
//日付取得
string date = DateTime.Now.ToString("yyyyMMddhhmss");
//ファイル保存ダイアログインスタンス作成
SaveFileDialog dlg = new SaveFileDialog
{
FileName = "SinCosData_" + date + ".csv", //デフォルトファイル名
InitialDirectory = @"C:\", //デフォルトディレクトリ
Filter = "CSVファイル|*.csv|すべてのファイル|*.*", //ファイルのフィルタ
FilterIndex = 0 //ファイルの種類
};
// 指定されたファイル名を取得
if (dlg.ShowDialog() == true)
{
Stream st = dlg.OpenFile();
StreamWriter sw = new StreamWriter(st, Encoding.GetEncoding("UTF-8"));
sw.WriteLine("fs,freq,size");
sw.WriteLine(fs + "," + freq + "," + size);
sw.WriteLine("No,Sin,Cos");
for (int i = 0; i < size; i++)
{
sw.WriteLine(i +"," + sindata_res[i] + "," + cosdata_res[i]); //Sin,Cosのデータを挿入
}
sw.Close();
st.Close();
MessageBox.Show("CSVFile出力完了.");
}
else
{
MessageBox.Show("Cancel.");
}
}
}
}
CSV出力ボタン押下時の画面結果
画面に波形が表示されたら、CSV出力ボタンを押下する。
CSV出力ボタン押下して、保存ダイアログで保存した後、完了メッセージBoxが表示される。
まとめ
波形のデータ数値をcsvに保存できるので、Excelで波形を表示でき、汎用性が上がると思います。
以上、csvファイル出力方法の紹介でした。
参考になれば幸いです。
