Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88

Генератор гармонических колебаний на Java

10.07.2017, 17:38. Показов 2743. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать программу, которая бы генерировала несколько(3-5) гармонических сигналов и накладывала на них случайный шум. В дальнейшем эти сигналы с наложенным на них шумом будут считываться другой программой, но не суть.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.07.2017, 17:38
Ответы с готовыми решениями:

Генератор гармонических колебаний
Здравствуйте! Подскажите пожалуйста, как сделать на операционном усилители генератор гармонических колебаний двух частот? В спектре...

Дан график гармонических колебаний. Найти фазу колебаний
Найти в момент времени 4,5 с: 1) циклическую частоту; 2) фазу колебаний (0 <= f <= 2пи); 3) скорость; 4) ускорение...

Уравнения гармонических колебаний
два шарика с зарядами +q и -q и массой m жестко связанные невесомым стержнем длины l, находятся в невесомости в электрическом поле,которое...

17
 Аватар для Aviz__
2756 / 2063 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
10.07.2017, 18:34
Куда они должны подаваться?
0
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88
10.07.2017, 19:12  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
Куда они должны подаваться?
В лог файл, лучше даже чтобы это был не один перезаписываемый, а несколько пронумерованных.
0
 Аватар для Aviz__
2756 / 2063 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
10.07.2017, 19:25
С каким шагом по времени, частотой осцилляции и точностью?
Приведите здесь несколько строк желаемого формата этих файлов.
0
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88
10.07.2017, 19:54  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
С каким шагом по времени, частотой осцилляции и точностью?
Раз в секунду обновляется файл, по 3 записи за раз, точность не особо важна.
Цитата Сообщение от Aviz__ Посмотреть сообщение
Приведите здесь несколько строк желаемого формата этих файлов.
Кликните здесь для просмотра всего текста
-2017.01.01-17:37:25-//время начала генерации
12 //записи в лог заносятся построчно
14
13
14
15
--2017.01.01-17:39:28-//время завершения генерации
0
 Аватар для Aviz__
2756 / 2063 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
10.07.2017, 20:04
Ладно, а какая амплитуда, и сдвиг по фазе между осцилляторами?
0
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88
10.07.2017, 20:15  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
Ладно, а какая амплитуда, и сдвиг по фазе между осцилляторами?
Амплитуда 20 и сдвиг пи/8
0
 Аватар для Aviz__
2756 / 2063 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
13.07.2017, 14:31
Вот, вам примерная заготовка. Уверен, что все остальное вы с легкостью допишите сами.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
package cyberforumOOP.oscillator;
 
/** */
public class TestOscillator {
    public static void main(String[] args) {
        Oscillator osc1 = new Oscillator("Os1", 6);
        osc1.getVibration();
    }
}
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package cyberforumOOP.oscillator;
 
import java.util.Timer;
 
/** */
public class Oscillator {
    private String name;
    public static final int FREQUENCY_MILLIS = 333; // все осциляторы (объеты) имеют одинаков. частоту
    public static final int AMPLITUDE = 20;  // амплитуду
    private double phaseShift = 0.0;
    public static int durationWork;  // и время работы
 
    public Oscillator(String name, int durationWork) {
        this.name = name;
        Oscillator.durationWork = durationWork;
    }
 
    public void getVibration(){
        final Timer timer = new Timer();
        timer.schedule(new MyTimerTask(timer),0, Oscillator.FREQUENCY_MILLIS);
        int q = 5;
    }
}
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package cyberforumOOP.oscillator;
 
import java.util.Timer;
import java.util.TimerTask;
 
/** */
public class MyTimerTask extends TimerTask {
    private float i;
    Timer timer;
 
    public MyTimerTask(Timer timer) {
        this.timer = timer;
    }
 
    @Override
    public void run() {
        if (i >= Oscillator.durationWork) {
            timer.cancel();
        }
        System.out.printf("%3d,", Math.round(Oscillator.AMPLITUDE * Math.sin(i)));
        i += Oscillator.FREQUENCY_MILLIS/1000.0;
    }
}
результат работы
Bash
1
  0,  7, 12, 17, 19, 20, 18, 14,  9,  3, -4,-10,-15,-19,-20,-19,-16,-12, -6,  1,
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
13.07.2017, 14:46
Формат выходного файла сгенерированного классом SineWaveRun
Время проставляется реальное. Начало текущее время, конец с учетом
длительности работы заданных синусоид. Число отсчетов 200, и для Fsample = 10Гц
время завершения будет на 20 секунд позже.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
-- 2017.06.13-14:22:14-
00008.2404
00010.7469
00012.6780
00014.7409
00016.1904
00017.4066
00018.9079
...
00003.5239
00006.1362
-- 2017.06.13-14:22:14-


Формат файлов параметров на 1 синусоиду без шума, амплитуда 20, сдвиг PI/8
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% File Parameters
% format
% n  = number of frequencies
% FS = sample Frequency, Hz
% AN = amplitude of Noise  0..inf
% OF = Offset for all frequencies  -inf..inf
% F1 = frequency F1, Hz    0..inf
% A1 = amplitude of frequency F1   0..inf
% P1 = angle of frequency  F1     -inf ..inf radians
% F2 = frequency F2, Hz    0..inf
% A2 = amplitude of frequency F2   0..inf
% P2 = angle of frequency  F2,     0..2*PI
%...  
% FN = frequency FN,Hz    0..inf
% AN = amplitude of frequency FN,   0..inf
% PN = angle of frequency  FN,     0..2*PI
1
100000
0.0   
10    
1000  
20    
0.3932375   // PI/8

Формат файлов параметров на 1 и 2 синусоиды и шум
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% File Parameters
% format
% n  = number of frequencies
% FS = sample Frequency, Hz
% AN = amplitude of Noise  0..inf
% OF = Offset for all frequencies  -inf..inf
% F1 = frequency F1, Hz    0..inf
% A1 = amplitude of frequency F1   0..inf
% P1 = angle of frequency  F1     -inf ..inf radians
% F2 = frequency F2, Hz    0..inf
% A2 = amplitude of frequency F2   0..inf
% P2 = angle of frequency  F2,     0..2*PI
%...  
% FN = frequency FN,Hz    0..inf
% AN = amplitude of frequency FN,   0..inf
% PN = angle of frequency  FN,     0..2*PI
1
50000       //FS
1.0         //Noise
0           // OFFSET
1000        //F1
20          //A1
0.39269875  // PI/8
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
% File Parameters
% format
% n  = number of frequencies
% FS = sample Frequency, Hz
% AN = amplitude of Noise  0..inf
% OF = Offset for all frequencies  -inf..inf
% F1 = frequency F1, Hz    0..inf
% A1 = amplitude of frequency F1   0..inf
% P1 = angle of frequency  F1     -inf ..inf radians
% F2 = frequency F2, Hz    0..inf
% A2 = amplitude of frequency F2   0..inf
% P2 = angle of frequency  F2,     0..2*PI
%...  
% FN = frequency FN,Hz    0..inf
% AN = amplitude of frequency FN,   0..inf
% PN = angle of frequency  FN,     0..2*PI
2
100000  //FS
10.0    //Noise
10      // OFFSET
1000    //F1
20      //A1
-1.57095 // -PI/2
2000    //F2
20.0    //A2
0       //0*PI

Файлы параметров для генерации синусоид от 1 до 4 с разными сдвигами с шумом и без в архиве _samples.zip
Вложения
Тип файла: zip _samples.zip (2.9 Кб, 6 просмотров)
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
13.07.2017, 14:48
Класс SineDrawRun рисует синусоиду на 200 точек с учетом частоты сэмплирования и амплитуды
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import javax.swing.*;
import java.awt.*;
 
public class SineDrawRun extends JPanel {
    public static final int N_POINTS = 200;
    private static final int N_WINDOW = 100; // число точек на отображение в окне
    private static final int N_SAMPLE = 20;  // число точек на период
    private int points;
    private double[] sines;
    private int[] pts;
    private int offset;
    private double min;
    private double max;
 
    public SineDrawRun() {  // заполняем по умолчанию
        points = N_POINTS;
        offset = 0;    // начальное смещение
        sines = new double[points];
        min =Double.POSITIVE_INFINITY;
        max = Double.NEGATIVE_INFINITY;
        for (int i = 0; i < points; i++) {
            double radians = (N_SAMPLE * Math.PI / N_POINTS) * i;
            sines[i] = Math.sin(radians);
            if (max < sines[i]) {
                max = sines[i];
            }
            if(min > sines[i])
            min = sines[i];
        }
    }
 
    public SineDrawRun(double[] data, int nSample) {  // nsample = fs/f
        points = data.length;
        offset = 0;    // начальное смещение
        setData(data);     // заполняем массив данных
    }
 
    public void setData(double[] data) {
        if (data == null || data.length == 0) {
            min = 0;
            max = 0;
            sines = new double[N_POINTS];
            repaint();
            return;
        }
 
        int length = data.length;
        min = 0;
        max = data[0];
        for (int i = 0; i < sines.length; i++) {
            if (i >= length) {
                sines[i] = 0;
                continue;
            }
            sines[i] = data[i];
            if(max < data[i]) {
                max = data[i];
            }
            if (min > data[i]) {
                min = data[i];
            }
 
        }
        offset = 0;
        repaint();
    }
 
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int startX = 10;
        int startY = 10;
 
        int maxWidth = getWidth();
        int maxHeight = getHeight();
        double hStep = (double) maxWidth / (double) N_WINDOW;   // смасштабировать в размер окна
        pts = new int[N_WINDOW];                                // в ширину окна
        int j = offset;
        double scaleY = (maxHeight - 2*startY)/(max - min);
 
        for (int i = 0; i < N_WINDOW; i++) {
            pts[i] = maxHeight- ((int) ((sines[j++]-min) * scaleY + startY)); // +flipV
        }
        g.setColor(Color.RED);
        for (int i = 1; i < N_WINDOW; i++) {
            int x1 = (int) ((i - 1) * hStep) + startX;
            int x2 = (int) ((i) * hStep) + startX;
            int y1 = pts[i - 1];
            int y2 = pts[i];
            g.drawLine(x1, y1, x2, y2);
            if ((i + offset) % 10 == 0) {
                g.setColor(Color.BLACK);
                g.drawString((i + offset) + "", x1, maxHeight / 2 + 20);
                g.setColor(Color.RED);
            }
        }
// axes
        g.setColor(Color.BLACK);
        g.drawLine(startX, maxHeight - startY, startX, startY);
        g.drawLine(startX, maxHeight / 2, maxWidth - 2 * startX, maxHeight / 2);
    }
 
    public int setOffset(int offset) {
        if (!(offset < 0 || offset > points - N_WINDOW)) {
            this.offset = offset;
        }
        repaint();
        return this.offset;
    }
 
    public double[] getSines() {
        return sines.clone();
    }
}
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
13.07.2017, 14:57
Класс SineWaveRun генерит файлы и выводит их в график любое число синусоид с шумом
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import java.util.List;
 
public class SineWaveRun extends JFrame {
    private static final int MAXOFFSET = 200;
 
    private SineDrawRun jpSines = new SineDrawRun();
    private JSlider jsOffset = new JSlider(1, MAXOFFSET, 50);
    private JTextField jtOffset = new JTextField("", 5);
    private JTextField jtFile = new JTextField("choose file", 10);
    private JButton jButton = new JButton("Open file");
    private String path = "C:\\Temp";
    private String paramName = "sample.txt";
    private String fileName = "";
    private JFileChooser jFileChooser = new JFileChooser(path);
    private JFileChooser jFileChooserP = new JFileChooser(path);
    private JFileChooser jFileChooserG = new JFileChooser(path);
    private File fileGen;
    // генератор
    private JLabel jParam2 = new JLabel("Parameters:");
    private JTextField jtParam2 = new JTextField(paramName, 10);
    private JButton jButton1 = new JButton("Select");
    private JLabel jGenerate2 = new JLabel("Generated:");
    private JTextField jtGenerate2 = new JTextField("no file ... ", 15);
    private JButton jButton2 = new JButton("Generate");
    private File fileParam;
    private double[] param;
 
    public void selectFile(JFileChooser jFileChooser) {
        jFileChooser.setFileFilter(new FileFilter() {
            @Override
            public boolean accept(File f) {
                if (f.isDirectory()) {
                    return true;
                } else {
                    String fileName = f.getName().toLowerCase();
                    return fileName.endsWith(".txt") || fileName.endsWith(".log");
                }
            }
 
            @Override
            public String getDescription() {
                return "*.txt,*log";
            }
        });
        int result = jFileChooser.showOpenDialog(SineWaveRun.this);
        if (result == JFileChooser.APPROVE_OPTION) {
            // fileName = jFileChooser.getSelectedFile().getName();
            //jtFile.setText(jFileChooser.getSelectedFile().getName());
        }
        if (result == JFileChooser.CANCEL_OPTION) {
 
        }
    }
 
    private double[] loadData(File file) {
        List<Double> list = new ArrayList();
        String s = "";
        try {
            Scanner in = new Scanner(new FileInputStream(file)); // напрямую с файла
            while (in.hasNext()) {
                if (in.hasNextDouble()) {
                    list.add(in.nextDouble());
                } else {
                    s = in.nextLine();
                }
            }
            in.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        double[] data = new double[list.size()];
        for (int i = 0; i < list.size(); i++) {
            data[i] = list.get(i);
        }
        return data;
    }
 
 
    private boolean saveData(File file) {
        Random rnd = new Random();
 
        int n = (int) param[0]; // число частот
        double[] f = new double[n];
        double[] a = new double[n];
        double[] p = new double[n];
        double fs = param[1];
        double na = param[2];
        double fOffset = param[3];
        int j = 4;
        for (int i = 0; i < f.length; i++) {
            f[i] = param[j++];
            a[i] = param[j++];
            p[i] = param[j++];
        }
 
// поля уже проверены
        List<Double> list = new ArrayList();
        try {
            PrintStream ps = new PrintStream(new FileOutputStream(file));
            Calendar c = Calendar.getInstance();
            long time = c.getTimeInMillis();
            int nPoints = SineDrawRun.N_POINTS;
            double duration = (double) nPoints * 1000 / fs; // получили миллисекунды
            String s = String.format("-- %4d.%02d.%02d-%02d:%02d:%02d-",
                    c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH),
                    c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), c.get(Calendar.SECOND));
            ps.println(s);
// генерация данных
            for (int i = 0; i < nPoints; i++) {        // по каждому отсчету сумма всего
                double fAmp = 0;                        // общая амплитуда отсчета
                double nAmp = rnd.nextDouble() * na;      // амплитуда шума одна на все частоты
                double fAmp2 = 0;                        // общая амплитуда отсчета
                for (int k = 0; k < n; k++) {          // по всем частотам
                    fAmp2 = a[k] * Math.sin(i*2 * Math.PI * f[k] / fs + p[k]);
                    fAmp += fAmp2;
                }
 
                fAmp += nAmp;
                fAmp += fOffset; // добавили смещение
                ps.printf("%010.4f\n",fAmp);  // записали отсчет
            }
            c.setTimeInMillis(time + (long) duration);
            s = String.format("-- %4d.%02d.%02d-%02d:%02d:%02d-",
                    c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH),
                    c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), c.get(Calendar.SECOND));
            ps.println(s);
            ps.close();
 
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        double[] data = new double[list.size()];
        for (int i = 0; i < list.size(); i++) {
            data[i] = list.get(i);
        }
 
        return true;
    }
 
    private double[] loadParam(File file) {
        double[] data = loadData(file);
        if (data == null || data.length == 0) {
            return null;
        }
        int n = (int) data[0];
        if (data.length < 4 + n * 3) {
            return null;
        }
        int j = 1;
        double fs = data[j++];
        if (fs < 0) {
            jtParam2.setText("wrong Fs < 0");
            return null;
        }
        double na = data[j++];
        if (na < 0) {
            jtParam2.setText("wrong Na < 0");
            return null;
        }
        j++;  // offset
 
        for (int i = 0; i < n; i++) {
            double f = data[j++];
            double a = data[j++];
            j++;
            if (f < 0 || a < 0 || f >= fs) {
                jtParam2.setText("wrong F" + i + " A" + i + " < 0");
                return null;
            }
            if (f >= fs) {
                jtParam2.setText("wrong F" + i + " > Fs");
                return null;
            }
        }
        if (data.length == 0) {
            return null;
        }
        return data;
 
    }
 
    public SineWaveRun() throws HeadlessException {
        jsOffset.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                int value = ((JSlider) e.getSource()).getValue();
                value = jpSines.setOffset(value);     // задать новое значение
                jtOffset.setText(String.format("%2d", value));
            }
        });
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selectFile(jFileChooser);
                File file = jFileChooser.getSelectedFile();
                if (file != null && file.exists() && !file.isDirectory() &&
                        !fileName.equals(jFileChooser.getSelectedFile().getName())) {
//                    System.out.println("selected new file");
                    fileName = jFileChooser.getSelectedFile().getName();
                    jtFile.setText(jFileChooser.getSelectedFile().getName());
// загрузка данных
                    double[] data = loadData(file);
                    jpSines.setData(data);
                }
            }
        });
 
        jButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selectFile(jFileChooserG);
                File file = jFileChooserG.getSelectedFile();
                if (file != null) {
                    String fileName = jFileChooserG.getSelectedFile().getName();
                    if (!(fileName.endsWith(".txt") || fileName.endsWith("*.log"))) {
                        file = new File(file.getPath() + ".txt");
                        fileName = file.getName();
                    }
 
// запись данных
//                    System.out.println("write to:" + fileName);
// загрузка параметров по умолчанию
                    if (param == null || param.length == 0) {
                        File fileParam = new File(path + "\" + paramName);
                        if (fileParam == null || !fileParam.exists()) {
                            jtGenerate2.setText("no file param");
                        }
                        param = loadParam(fileParam);
                        if (param == null || param.length == 0) {
                            jtGenerate2.setText("wrong param or empty");
                        }
                    }
                    saveData(file);
                    jtGenerate2.setText(fileName);
// загрузка данных
                    double[] data = loadData(file);
                    jpSines.setData(data);
                }
            }
        });
 
        jButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selectFile(jFileChooserP);
                File file = jFileChooserP.getSelectedFile();
                if (file != null) {
                    String fileName = jFileChooserP.getSelectedFile().getName();
                    System.out.println("parameters from:" + fileName);
                    jtParam2.setText(fileName);
                    fileParam = jFileChooserP.getSelectedFile();
                    param = loadParam(fileParam);
                }
 
            }
        });
 
//Read
        JPanel jp = new JPanel(new FlowLayout());
        jtOffset.setText(String.format("%2d", jsOffset.getValue()));
        jtOffset.setEditable(false);
        jtFile.setEditable(false);
 
        JLabel jLabel = new JLabel("Oscilloscope Diagram:");
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);
        JLabel jLabel2 = new JLabel("");
        jLabel2.setPreferredSize(new Dimension(100, 20));
 
        jp.add(jsOffset);
        jp.add(jtOffset);
        jp.add(jLabel2);
        jp.add(jtFile);
        jp.add(jButton);
//Gen
        JPanel jp2 = new JPanel(new FlowLayout());
        jp2.add(jParam2);
        jp2.add(jtParam2);
        jp2.add(jButton1);
        jp2.add(jGenerate2);
        jp2.add(jtGenerate2);
        jp2.add(jButton2);
//South
        JPanel jpSouth = new JPanel(new GridLayout(2, 1));
        jpSouth.add(jp);
        jpSouth.add(jp2);
 
        add(jLabel, BorderLayout.NORTH);
        add(jpSouth, BorderLayout.SOUTH);
        jpSines.setOffset(jsOffset.getValue()); // задать начальное значение
        jpSines.setBackground(new Color(230, 230, 245));
        add(jpSines);
 
        //        timer.scheduleAtFixedRate(timerTask,0,delay);
 
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame jFrame = new SineWaveRun();
                jFrame.setSize(700, 400);
                jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 
                jFrame.setLocationRelativeTo(null);
                jFrame.setVisible(true);
            }
        });
    }
 
 
}

Смотрите код. SineWaveRun запускается и позволяет сгенерить и посмотреть синусоиды по файлу параметров.
Работать так. Папка по умолчанию C:\Temp
Разместить в ней файл sample.txt Это файл параметров по умолчанию.
Запустить, нажать Generate выбрать любое имя файла. Все.
Чтобы работать с другим файлом параметров, выбрать его кнопкой Select.
Чтобы вывести синусоиду сгенеренного ранее файла, нажать кнопку Open.
Параметры которые задаются:
1. Число синусоид
2. Частота сэмплирования, она должна быть в 2 раза больше максимальной частоты сигнала и без нее никак.
3. Частота, амплитуда и фала первой синусоиды (если одна тогда все)
Частота, амплитуда и фала второй и так далее синусоид
0
 Аватар для Aviz__
2756 / 2063 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
13.07.2017, 15:17
azusa_nakano, Во, видите, как все уже есть у людей)).
0
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88
12.08.2017, 16:09  [ТС]
Цитата Сообщение от v777779 Посмотреть сообщение
Работать так. Папка по умолчанию C:\Temp
Разместить в ней файл sample.txt Это файл параметров по умолчанию.
Запустить, нажать Generate выбрать любое имя файла. Все.
Чтобы работать с другим файлом параметров, выбрать его кнопкой Select.
Чтобы вывести синусоиду сгенеренного ранее файла, нажать кнопку Open.
Спасибо большое, а у вас нет в таком случае уже готовой программы?
-0.50
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
15.08.2017, 14:42
В исходниках выше форум не пропустил в строке "path + "\" + fileName" вот эти две черты "\"
В итоге код требует доработки после копирования.
Прикладываю архив с исходниками и всеми файлами. Проверено.
Вложения
Тип файла: zip src.zip (10.3 Кб, 9 просмотров)
0
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88
16.08.2017, 18:40  [ТС]
Господа, не могу понять, почему возникает NullPointerExeption и как это можно исправить?

SineWaveRun:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
package generator;
 
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import java.util.List;
 
public class SineWaveRun extends JFrame {                                              //что-то не так тут 2
    private static final int MAXOFFSET = 200;
 
    private SineDrawRun jpSines = new SineDrawRun();
    private JSlider jsOffset = new JSlider(1, MAXOFFSET, 50);
    private JTextField jtOffset = new JTextField("", 5);
    private JTextField jtFile = new JTextField("choose file", 10);
    private JButton jButton = new JButton("Open file");
    private String path = "C:\\Temp";
    private String paramName = "sample.txt";
    private String fileName = "";
    private JFileChooser jFileChooser = new JFileChooser(path);
    private JFileChooser jFileChooserP = new JFileChooser(path);
    private JFileChooser jFileChooserG = new JFileChooser(path);
    // private File fileGen;
    // генератор
    private JLabel jParam2 = new JLabel("Parameters:");
    private JTextField jtParam2 = new JTextField(paramName, 10);
    private JButton jButton1 = new JButton("Select");
    private JLabel jGenerate2 = new JLabel("Generated:");
    private JTextField jtGenerate2 = new JTextField("no file ... ", 15);
    private JButton jButton2 = new JButton("Generate");
    private File fileParam;
    private double[] param;
 
    public void selectFile(JFileChooser jFileChooser) {
        jFileChooser.setFileFilter(new FileFilter() {
            @Override
            public boolean accept(File f) {
                if (f.isDirectory()) {
                    return true;
                } else {
                    String fileName = f.getName().toLowerCase();
                    return fileName.endsWith(".txt") || fileName.endsWith(".log");
                }
            }
 
            @Override
            public String getDescription() {
                return "*.txt,*log";
            }
        });
        int result = jFileChooser.showOpenDialog(SineWaveRun.this);
        if (result == JFileChooser.APPROVE_OPTION) {
            // fileName = jFileChooser.getSelectedFile().getName();
            //jtFile.setText(jFileChooser.getSelectedFile().getName());
        }
        if (result == JFileChooser.CANCEL_OPTION) {
 
        }
    }
 
    private double[] loadData(File file) {
        List<Double> list = new ArrayList();
        String s = "";
        try {
            Scanner in = new Scanner(new FileInputStream(file)); // напрямую с файла
            while (in.hasNext()) {
                if (in.hasNextDouble()) {
                    list.add(in.nextDouble());
                } else {
                    s = in.nextLine();
                }
            }
            in.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        double[] data = new double[list.size()];
        for (int i = 0; i < list.size(); i++) {
            data[i] = list.get(i);
        }
        return data;
    }
 
 
    private boolean saveData(File file) {
        Random rnd = new Random();
 
        int n = (int) param[0]; // число частот                                    что-то не так тут 1
        double[] f = new double[n];
        double[] a = new double[n];
        double[] p = new double[n];
        double fs = param[1];
        double na = param[2];
        double fOffset = param[3];
        int j = 4;
        for (int i = 0; i < f.length; i++) {
            f[i] = param[j++];
            a[i] = param[j++];
            p[i] = param[j++];
        }
 
// поля уже проверены
        List<Double> list = new ArrayList();
        try {
            PrintStream ps = new PrintStream(new FileOutputStream(file));
            Calendar c = Calendar.getInstance();
            long time = c.getTimeInMillis();
            int nPoints = SineDrawRun.N_POINTS;
            double duration = (double) nPoints * 1000 / fs; // получили миллисекунды
            String s = String.format("-- %4d.%02d.%02d-%02d:%02d:%02d-",
                    c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH),
                    c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), c.get(Calendar.SECOND));
            ps.println(s);
// генерация данных
            for (int i = 0; i < nPoints; i++) {        // по каждому отсчету сумма всего
                double fAmp = 0;                        // общая амплитуда отсчета
                double nAmp = rnd.nextDouble() * na;      // амплитуда шума одна на все частоты
                double fAmp2 = 0;                        // общая амплитуда отсчета
                for (int k = 0; k < n; k++) {          // по всем частотам
                    fAmp2 = a[k] * Math.sin(i*2 * Math.PI * f[k] / fs + p[k]);
                    fAmp += fAmp2;
                }
 
                fAmp += nAmp;
                fAmp += fOffset; // добавили смещение
                ps.printf("%010.4f\n",fAmp);  // записали отсчет
            }
            c.setTimeInMillis(time + (long) duration);
            s = String.format("-- %4d.%02d.%02d-%02d:%02d:%02d-",
                    c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH),
                    c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), c.get(Calendar.SECOND));
            ps.println(s);
            ps.close();
 
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        double[] data = new double[list.size()];
        for (int i = 0; i < list.size(); i++) {
            data[i] = list.get(i);
        }
 
        return true;
    }
 
    private double[] loadParam(File file) {
        double[] data = loadData(file);
        if (data == null || data.length == 0) {
            return null;
        }
        int n = (int) data[0];
        if (data.length < 4 + n * 3) {
            return null;
        }
        int j = 1;
        double fs = data[j++];
        if (fs < 0) {
            jtParam2.setText("wrong Fs < 0");
            return null;
        }
        double na = data[j++];
        if (na < 0) {
            jtParam2.setText("wrong Na < 0");
            return null;
        }
        j++;  // offset
 
        for (int i = 0; i < n; i++) {
            double f = data[j++];
            double a = data[j++];
            j++;
            if (f < 0 || a < 0 || f >= fs) {
                jtParam2.setText("wrong F" + i + " A" + i + " < 0");
                return null;
            }
            if (f >= fs) {
                jtParam2.setText("wrong F" + i + " > Fs");
                return null;
            }
        }
        if (data.length == 0) {
            return null;
        }
        return data;
 
    }
 
    public SineWaveRun() throws HeadlessException {
        jsOffset.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                int value = ((JSlider) e.getSource()).getValue();
                value = jpSines.setOffset(value);     // задать новое значение
                jtOffset.setText(String.format("%2d", value));
            }
        });
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selectFile(jFileChooser);
                File file = jFileChooser.getSelectedFile();
                if (file != null && file.exists() && !file.isDirectory() &&
                        !fileName.equals(jFileChooser.getSelectedFile().getName())) {
//                    System.out.println("selected new file");
                    fileName = jFileChooser.getSelectedFile().getName();
                    jtFile.setText(jFileChooser.getSelectedFile().getName());
// загрузка данных
                    double[] data = loadData(file);
                    jpSines.setData(data);
                }
            }
        });
 
        jButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selectFile(jFileChooserG);
                File file = jFileChooserG.getSelectedFile();
                if (file != null) {
                    String fileName = jFileChooserG.getSelectedFile().getName();
                    if (!(fileName.endsWith(".txt") || fileName.endsWith("*.log"))) {
                        file = new File(file.getPath() + ".txt");
                        fileName = file.getName();
                    }
 
// запись данных
//                    System.out.println("write to:" + fileName);
// загрузка параметров по умолчанию
                    if (param == null || param.length == 0) {
                        File fileParam = new File(path  + paramName);
                        if (fileParam == null || !fileParam.exists()) {
                            jtGenerate2.setText("no file param");
                        }
                        param = loadParam(fileParam);
                        if (param == null || param.length == 0) {
                            jtGenerate2.setText("wrong param or empty");
                        }
                    }
                    saveData(file);                                                     //что-то не так тут 3
                    jtGenerate2.setText(fileName);
// загрузка данных
                    double[] data = loadData(file);
                    jpSines.setData(data);
                }
            }
        });
 
        jButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selectFile(jFileChooserP);
                File file = jFileChooserP.getSelectedFile();
                if (file != null) {
                    String fileName = jFileChooserP.getSelectedFile().getName();
                    System.out.println("parameters from:" + fileName);
                    jtParam2.setText(fileName);
                    fileParam = jFileChooserP.getSelectedFile();
                    param = loadParam(fileParam);
                }
 
            }
        });
 
//Read
        JPanel jp = new JPanel(new FlowLayout());
        jtOffset.setText(String.format("%2d", jsOffset.getValue()));
        jtOffset.setEditable(false);
        jtFile.setEditable(false);
 
        JLabel jLabel = new JLabel("Oscilloscope Diagram:");
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);
        JLabel jLabel2 = new JLabel("");
        jLabel2.setPreferredSize(new Dimension(100, 20));
 
        jp.add(jsOffset);
        jp.add(jtOffset);
        jp.add(jLabel2);
        jp.add(jtFile);
        jp.add(jButton);
//Gen
        JPanel jp2 = new JPanel(new FlowLayout());
        jp2.add(jParam2);
        jp2.add(jtParam2);
        jp2.add(jButton1);
        jp2.add(jGenerate2);
        jp2.add(jtGenerate2);
        jp2.add(jButton2);
//South
        JPanel jpSouth = new JPanel(new GridLayout(2, 1));
        jpSouth.add(jp);
        jpSouth.add(jp2);
 
        add(jLabel, BorderLayout.NORTH);
        add(jpSouth, BorderLayout.SOUTH);
        jpSines.setOffset(jsOffset.getValue()); // задать начальное значение
        jpSines.setBackground(new Color(230, 230, 245));
        add(jpSines);
 
        //        timer.scheduleAtFixedRate(timerTa
        // sk,0,delay);
 
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame jFrame = new SineWaveRun();
                jFrame.setSize(700, 400);
                jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 
                jFrame.setLocationRelativeTo(null);
                jFrame.setVisible(true);
            }
        });
    }
 
 
}


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at generator.SineWaveRun.saveData(SineWaveR un.java:93)
at generator.SineWaveRun.access$1200(SineWa veRun.java:14)
at generator.SineWaveRun$4.actionPerformed( SineWaveRun.java:244)
0
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88
11.09.2017, 15:20  [ТС]
Никаких идей?
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
11.09.2017, 16:07
Дебагом смотрите почему там null, либо давайте файл, с которым возникает исключение.
0
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 88
11.09.2017, 16:20  [ТС]
Цитата Сообщение от Любопытный Посмотреть сообщение
Дебагом смотрите почему там null, либо давайте файл, с которым возникает исключение.
Вот исходные файлы проекта(и сам проект для netbeans 8.2) и папка temp, из которой берется файл sample с параметрами для генерации синусоид (с:\temp\sample.txt), сохранение которых должно бы производится в sampleout.txt
Вложения
Тип файла: zip Generator.zip (34.3 Кб, 7 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2017, 16:20
Помогаю со студенческими работами здесь

Графики гармонических колебаний
Всем привет. Помогите примерами построения графиков гармонических колебаний или литературой. Буду очень признателен.

Доказательство формул гармонических колебаний
Здравствуйте, помогите мне не сойти с ума. Мы начали проходит гармонические колебания и меня смущает доказательств основ этой темы. Чтобы...

Дифференциальное уравнение гармонических колебаний
! :scratch:!? Как из закона Гука: Fупр= -kx и второго закона Ньютона получить дифференциальное уравнение гармонических колебаний...

Низкочастотный автогенератора гармонических колебаний
Доброго времени суток всем. Помогите разобраться с реализацией автогенератора гармонических колебаний. Есть начальные параметры: рабочая...

Амплитуды вынужденных гармонических колебаний
Задача: Амплитуды вынужденных гармонических колебаний при частотах 400 Гц и 600 Гц равны между собой. Пренебрегая затуханием,определить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru