【wpf】正弦波余弦波の波形データをCSVファイルに出力する

csvFile
csvFile
C#.NET

ad2

【wpf】正弦波余弦波の波形データをCSVファイルに出力する

CSVファイル出力

まずは、どのような結果になるか示します。

CSVファイル内容

csv_show

 

ソースコードの紹介

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_btn

 

CSV出力ボタン押下して、保存ダイアログで保存した後、完了メッセージBoxが表示される。

csv_btn_end

まとめ

波形のデータ数値をcsvに保存できるので、Excelで波形を表示でき、汎用性が上がると思います。

以上、csvファイル出力方法の紹介でした。

参考になれば幸いです。