48969 (588621), страница 8
Текст из файла (страница 8)
using System;
using System.Collections;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using MultiScAn.Common.Attributes;
using MultiScAn.Common.Interfaces;
using MultiScAn.Common.Utils;
namespace MultiScAn.Common.Classes
{
public delegate void CommonHandler();
///
/// Summary description for Signal.
///
[Filter("Текстовый файл данных (*.dat)|*.dat")]
public class Signal : IData, ICleanable, IEnumerable
{
private int[] _data = new int[0];
private int _minValue = int.MaxValue;
private int _maxValue = int.MinValue;
private Bitmap _bitmap;
public Signal()
{
}
public void Rebuild(int size)
{
_data = new int[size];
_minValue = int.MaxValue;
_maxValue = int.MinValue;
_bitmap = null;
}
public void Load(string fileName)
{
int min = int.MaxValue, max = int.MinValue;
ArrayList list = new ArrayList();
using(StreamReader reader = File.OpenText(fileName))
{
string str = String.Empty;
while((str = reader.ReadLine()) != null)
{
str = str.Trim();
if (str != String.Empty)
{
string [] vals = str.Split(' ', '\t');
foreach(string val in vals)
{
int iVal = int.Parse(val);
DataUtil.Sort(iVal, ref min, ref max);
list.Add(iVal);
}
}
}
}
if (list.Count == 0) throw new NotSupportedException();
_data = (int[]) list.ToArray(typeof(int));
_minValue = min; _maxValue = max;
_bitmap = null;
if(OnLoad != null) OnLoad();
}
public event CommonHandler OnLoad;
public void Save(string fileName)
{
using(StreamWriter writer = File.CreateText(fileName))
{
foreach(int s in _data)
{
writer.WriteLine(s);
}
}
if (OnSave != null) OnSave();
}
public event CommonHandler OnSave;
public Bitmap Bitmap
{
get
{
if (_bitmap == null)
{
int min = _minValue > 0 ? 0 : -_minValue;
int max = _maxValue < 0 ? 0 : _maxValue;
Graphics g = null;
_bitmap = new Bitmap(2 * _data.Length, min + max);
g = Graphics.FromImage(_bitmap);
g.FillRectangle(new SolidBrush(Color.White), g.ClipBounds);
for(int i = 1; i <= _data.Length; i++)
{
g.DrawLine(new Pen(Color.Black),
new Point(2*i-1 , max),
new Point(2*i-1, max - _data[i-1]));
}
}
return _bitmap;
}
}
public void Clean()
{
_data = new int[0];
_minValue = int.MaxValue;
_maxValue = int.MinValue;
}
public bool IsEmpty
{
get { return _data.Length == 0; }
}
public int this[int index]
{
get { return _data[index]; }
set { sorter = _data[index] = value; }
}
private int sorter
{
set
{
DataUtil.Sort(value, ref _minValue, ref _maxValue);
}
}
public IEnumerator GetEnumerator()
{
return _data.GetEnumerator();
}
public int Length
{
get { return _data.Length; }
}
public void CopyTo(int[] arr)
{
_data.CopyTo(arr, 0);
}
}
}
П. 1.2. ТЕКСТ МОДУЛЯ WAVELET.CS
using MultiScAn.Common.Classes;
namespace MultiScAn.WaveletAnalysis
{
///
/// Summary description for Wavelet.
///
public class Wavelet : Signal
{
public Wavelet()
{
}
public double[] Resample(int size)
{
double[] res = new double[size];
for (int i = 0, offs = 0; i < size; i++, offs += base.Length)
{
res[i] = 0.0;
for (int j = 0; j < base.Length; j++)
{
res[i] += base[(offs + j)/size];
}
res[i] /= base.Length;
}
return res;
}
}
}
П. 1.3. ТЕКСТ МОДУЛЯ RESULT.CS
using System;
using System.Collections;
using System.Drawing;
using System.IO;
using MultiScAn.Common.Attributes;
using MultiScAn.Common.Classes;
using MultiScAn.Common.Interfaces;
using MultiScAn.Common.Utils;
namespace MultiScAn.WaveletAnalysis
{
///
/// Summary description for ResultUtil.
///
[Filter("Результат вейвлет анализа (*.war)|*.war")]
public class Result : IResult
{
double [,] _Data = new double[0, 0];
private Bitmap _bitmap;
private double _minValue = double.MaxValue;
private double _maxValue = double.MinValue;
private Spectrum _spectrum = new Spectrum();
public Result()
{
}
internal void Rebuild(int height, int width)
{
_bitmap = null;
_Data = new double[height, width];
_minValue = double.MaxValue;
_maxValue = double.MinValue;
}
public int Width
{
get { return _Data.GetLength(1); }
}
public int Height
{
get { return _Data.GetLength(0); }
}
public double this[int i, int j]
{
get { return _Data[i, j]; }
set { sorter = _Data[i, j] = value; }
}
public double MinValue
{
get { return _minValue; }
}
public double MaxValue
{
get { return _maxValue; }
}
public void Load(string fileName)
{
double min = double.MaxValue, max = double.MinValue;
double [,] data;
using(StreamReader reader = File.OpenText(fileName))
{
int width = int.Parse(__read(reader));
int height = int.Parse(__read(reader));
data = new double[width, height];
for(int i = 0; i < width; i++)
{
for(int j = 0; j < height; j++)
{
DataUtil.Sort(data[i, j] = double.Parse(__read(reader)), ref min, ref max);
}
}
}
_Data = data;
_minValue = min;
_maxValue = max;
_bitmap = null;
if(OnLoad != null) OnLoad();
}
private string __read(StreamReader reader)
{
string str = reader.ReadLine();
if (str == null) throw new NotSupportedException();
return str;
}
public event CommonHandler OnLoad;
public void Save(string fileName)
{
using(StreamWriter writer = File.CreateText(fileName))
{
int height = _Data.GetLength(0), width = _Data.GetLength(1);
writer.WriteLine(height);
writer.WriteLine(width);
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
writer.WriteLine(_Data[i, j]);
}
}
}
if (OnSave != null) OnSave();
}
public event CommonHandler OnSave;
public Bitmap Bitmap
{
get
{
if (_bitmap == null)
{
if (_spectrum.Length == 0) _spectrum.LoadDefault();
_bitmap = new Bitmap(Width, Height);
double k = (_spectrum.Length - 1) / (_maxValue - _minValue);
for(int i = 0; i < Height; i++)
{
for(int j = 0; j < Width; j++)
{
_bitmap.SetPixel(j, i, _spectrum[(int) (k *(_Data[i, j] - _minValue))]);
}
}
}
return _bitmap;
}
}
public void FormRow(Signal x, double[] y, int row)
{
int result_size = 2 * x.Length,
max_offset = x.Length - y.Length,
null_offset = Math.Min(y.Length - 1, result_size);
if (result_size != _Data.GetLength(1)) throw new ArgumentOutOfRangeException();
for (int i = 0; i < null_offset; i++)
{
this[row, i] = 0.0;
}
if (null_offset == result_size) return; // зачем делать лишние движения, если и так уже всё забито нулями
for (int i = 0; i <= max_offset; i++)
{
double sum = 0.0;
for (int j = 0; j < y.Length; j++)
{
sum += x[i+j] * y[j];
}
this[row, 2*i+y.Length-1] = sum;
this[row, 2*i+y.Length] = 0.0;
}
for (int i = result_size - null_offset; i < result_size; i++)
{
this[row, i] = 0.0;
}
}
public Spectrum Spectrum
{
get { return _spectrum; }
set { _spectrum = value; }
}
private double sorter
{
set
{
DataUtil.Sort(value, ref _minValue, ref _maxValue);
}
}
}
}
П. 1.3. ТЕКСТ МОДУЛЯ ANALYZER.CS
using System;
using System.Diagnostics;
using MultiScAn.Common.Classes;
using MultiScAn.Common.Interfaces;
namespace MultiScAn.WaveletAnalysis
{
///
/// Summary description for Analysis.
///
public class Analyzer : IAnalyzer
{
public const double DEFAULT_SCALE = 1.0;
private Wavelet _Wavelet = new Wavelet();
private Signal _Data = new Signal();
public Analyzer()
{
}
// public Analyzer(Wavelet wavelet, Wavelet data)
// {
// _Wavelet = wavelet;
// _Data = data;
// }
public Wavelet Wavelet
{
get { return _Wavelet; }
set { _Wavelet = value; }
}
public Signal Data
{
get { return _Data; }
set { _Data = value; }
}
public void Analyze(IResult result)
{
Analyze(DEFAULT_SCALE, (Result)result);
}
public void Analyze(double scale, Result result)
{
if (_Wavelet == null) throw new ArgumentNullException("Wavelet");
if (_Data == null) throw new ArgumentNullException("Data");
int size = (int)(_Wavelet.Length * scale);
// Wavelet [] result = new Wavelet[size];
result.Rebuild(size, 2 * _Data.Length);
for (int i = 0; i < size; i++)
{
result.FormRow(_Data, _Wavelet.Resample(size - i), i);
// Trace.WriteLine(String.Format("{0} / {1}", i, size));
}
}
}
}
ПРИЛОЖЕНИЕ 2
РУКОВОДСТВО ПРОГРАММИСТА
П.2.1. НАЗНАЧЕНИЕ ПРОГРАММЫ
Программа вейвлет-анализа имеет идентификатор WaveletAnalysis. Программа WaveletAnalysis выполняет следующие функции:
-
загрузка и сохранение дискретных сигналов (включая вейвлеты);
-
расчёт, загрузка и сохранение результатов вейвлет-анализа;
-
предоставление интерфейсов для подсистемы визуализации данных МАДС;
Программа WaveletAnalysis входит в состав системы МАДС в качестве динамически загружаемой библиотеки. Система МАДС реализует многомасштабный анализ дискретных сигналов методами вейвлет-анализа и структурной индексации.
П.2.2. УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ
Программа WaveletAnalysis предъявляет следующие требования к техническим средствам:
-
стандартный x86-совместимый ПК;
-
тактовая частота процессора не менее 900 МГц;
-
объем оперативной памяти не менее 128 Мб;
-
разрешение экрана монитора не менее 1024x768.
Программа WaveletAnalysis предъявляет следующие требования к программным средствам:
-
операционная система семейства Windows (Windows NT/2000/XP);
-
.NET Framework версии 1.1;
П.2.3. ХАРАКТЕРИСТИКА ПРОГРАММЫ
Программа WaveletAnalysis входит в состав системы МАДС в качестве динамически загружаемой библиотеки.
В состав программы входят следующие файлы, необходимые для ее функционирования:
-
MultiScAn.Visualization.exe – исполняемый модуль подсистемы визуализации данных;
-
MultiScAn.Common.dll – библиотека, содержащая базовые классы и интерфейсы необходимые для функционирования системы МАДС;
-
MultiScAn.WaveletAnalysis.dll – библиотека, реализующая вейвлет-анализ;
-
DialCol.txt – файл цветовой шкалы, используемой для визуализации результатов вейвлет-анализа.
Программа является интерактивной, т.е. требующей взаимодействия с пользователем, поэтому время выполнения отдельных этапов обработки не превышает 0.5 с. при использовании требуемых технических средств.
П.2.4. ОБРАЩЕНИЕ К ПРОГРАММЕ
Для вызова программы необходимо запустить на выполнение файл MultiScAn.Visualization.exe и выбрать закладку «Вейвлет-анализ».
Интерфейс программы WaveletAnalysis представлен на рис. П.2.1.
Описание панели инструментов программы WaveletAnalysis представлено в табл. П.2.1.
Интерфейс программы WaveletAnalysis
Рис. П.2.1
Таблица П.2.1
Панель инструментов программы WaveletAnalysis
Кнопка на панели инструментов | Значение |
| Выход из приложения |
| Загрузка анализируемого сигнала из текстового файла |
| Загрузка вейвелета из текстового файла |
| Вейвлет-анализ сигнала |
| Сохранение результатов вейвлет-анализа в текстовый файл |
| Настройка программы |
| Просмотр диалога «О программе» |
Для загрузки, сохранения или сохранения изображения анализируемого сигнала, вейвлета или результата вейвлет-анализа в соответсвующей закладке («Данные», «Вейвлет» или «Результат») необходимо выбрать соответсвующий пункт контекстного меню («Загрузить», «Сохранить» или «Сохранить изображение…») или нажать на соответствующую кнопку панели инструментов (см. табл. П.2.1).
В стандартном диалоге открытия файла необходимо выбрать нужный файл. В итоге на соответсвующей закладке («Данные», «Вейвлет» или «Результат») появляется графическое изображение анализируемого сигнала, вейвлета или результата вейвлет-анализа.
П.2.5. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ
Входной информацией являются текстовые файлы с расширением «.dat» (от англ. data – данные), содержащие данные исходного сигнала.
Структура входного файла «.dat»:
где – количество данных;
,
– значение сигнала, целое число.
Выходной информацией для данной задачи являются текстовые файлы с расширением «.war» (от англ. wavelet analysis result – результат вейвлет-анализа), содержащие результаты вейвлет-анализа.
Структура выходного файла «.war»:
где – ширина растра;
– высота растра;
,
,
– результат вейвлет-анализа, вещественное число.
П.2.6. СООБЩЕНИЯ ПРОГРАММИСТУ
Сообщения, выдаваемые программисту, приведены в табл. П.2.2.
Таблица П.2.2
Сообщения программисту
Сообщение | Действие программиста |
Неверный формат входной строки | Выбранный файл данных имеет некорректный формат. При необходимости попытаться загрузить другой файл данных |
Невозможно найти файл «Resources\DialCol.txt» | Результат вейвлет-анализа успешно рассчитан или загружен, но не может быть отображен в связи с тем, что не найден файл цветовой шкалы. Необходимые действия описаны в приложении 2.7 |
Результаты загрузки и вычислений выводятся в интерфейсном элементе так, как это приведено на рис.П.2.2 и П.2.3.
Результат загрузки вейвлета
Рис. П.2.2
Результат вейвлет-анализа сигнала
Рис. П.2.3
П.2.7. НАСТРОЙКА ПРОГРАММЫ
Для функционирования программы WaveletAnalysis необходимо установить .NET Framework версии 1.1.
Визуализация результатов вейвлет-анализа требует наличие файла цветовой шкалы. Для этого необходимо создать каталог Resources в каталоге с программой и поместить в него файл DialCol.txt.
ПРИЛОЖЕНИЕ 3
РУКОВОДСТВО ОПЕРАТОРА
П.3.1. НАЗНАЧЕНИЕ ПРОГРАММЫ
Программа вейвлет-анализа имеет идентификатор WaveletAnalysis. Программа WaveletAnalysis выполняет следующие функции:
-
загрузка и сохранение дискретных сигналов (включая вейвлеты);
-
расчёт, загрузка и сохранение результатов вейвлет-анализа;
-
предоставление интерфейсов для подсистемы визуализации данных МАДС;
Программа WaveletAnalysis входит в состав системы МАДС в качестве динамически загружаемой библиотеки. Система МАДС реализует многомасштабный анализ дискретных сигналов методами вейвлет-анализа и структурной индексации.
П.3.2. УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ
Программа WaveletAnalysis предъявляет следующие требования к техническим средствам:
-
стандартный x86-совместимый ПК;
-
тактовая частота процессора не менее 900 МГц;
-
объем оперативной памяти не менее 128 Мб;
-
разрешение экрана монитора не менее 1024x768.
Программа WaveletAnalysis предъявляет следующие требования к программным средствам:
-
операционная система семейства Windows (Windows NT/2000/XP);
-
.NET Framework версии 1.1;
-
наличие в каталоге программы файлов MultiScAn.Visualization.exe, MultiScAn.Common.dll, MultiScAn.WaveletAnalysis.dll и Resources\DialCol.txt.
П.3.3. ВЫПОЛНЕНИЕ ПРОГРАММЫ
Для вызова программы необходимо запустить на выполнение файл MultiScAn.Visualization.exe и выбрать закладку «Вейвлет-анализ».
Интерфейс программы WaveletAnalysis представлен на рис. П.3.1.
Интерфейс программы WaveletAnalysis
Рис. П.3.1
Описание панели инструментов программы WaveletAnalysis представлено в табл. П.3.1.
Для загрузки, сохранения или сохранения изображения анализируемого сигнала, вейвлета или результата вейвлет-анализа в соответсвующей закладке («Данные», «Вейвлет» или «Результат») необходимо выбрать соответсвующий пункт контекстного меню («Загрузить», «Сохранить» или «Сохранить изображение…») или нажать на соответствующую кнопку панели инструментов (см. табл. П.3.1).
В стандартном диалоге открытия файла необходимо выбрать нужный файл. В итоге на соответсвующей закладке («Данные», «Вейвлет» или «Результат») появляется графическое изображение анализируемого сигнала, вейвлета или результата вейвлет-анализа.
Таблица П.3.1
Панель инструментов программы WaveletAnalysis
Кнопка на панели инструментов | Значение |
| Выход из приложения |
| Загрузка анализируемого сигнала из текстового файла |
| Загрузка вейвелета из текстового файла |
| Вейвлет-анализ сигнала |
| Сохранение результатов вейвлет-анализа в текстовый файл |
| Настройка программы |
| Просмотр диалога «О программе» |
П. 3.4. СООБЩЕНИЯ ОПЕРАТОРУ
Сообщения, выдаваемые оператору, приведены в табл. П.3.2.
Таблица П.3.2
Сообщения оператору
Сообщение | Действие программиста |
Неверный формат входной строки | Выбранный файл данных имеет некорректный формат. При необходимости попытаться загрузить другой файл данных |
Невозможно найти файл «Resources\DialCol.txt» | Результат вейвлет-анализа успешно рассчитан или загружен, но не может быть отображен в связи с тем, что не найден файл цветовой шкалы. Необходимые действия описаны в приложении 2.7 |
Результаты вычислений выводятся в интерфейсном элементе так, как это приведено на рис. П.3.2.
Результат вейвлет-анализа сигнала
Рис. П.3.2