Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
1

Как получить спектр, имея текстовый файл с данными отсчетов оцифрованной акселерограммы при помощи преобразования Фурье

27.02.2019, 18:04. Показов 4518. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Дорогие друзья подскажите пожалуйста, как мне получить спектр имея текстовый файл с данными отсчетов оцифрованной акселерограммы при помощи преобразования Фурье, например за 10 секунд. Нашел кучу разных кодов , но у меня не получается, может параметры не правильно задаю. Помогите пожалуйста!
Вложения
Тип файла: txt Siga.txt (18.3 Кб, 44 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2019, 18:04
Ответы с готовыми решениями:

Число отсчетов для корректного Фурье преобразования
Всем добрый вечер! Хотел бы уточнить как увеличение/уменьшение числа отсчетов влияет на результаты...

Фазовый спектр сигнала после преобразования Фурье
Нужно построить график фазового спектра сигнала. Преобразование Фурье сделал. Как построить график...

Как в модуле SIM7600E-H при помощи AT-команд создать текстовый файл
Подскажите пожалуйста как в модуле SIM7600E-H при помощи AT-команд создать текстовый файл с...

Как при помощи FSO можно обработать такой (см.внизу)текстовый файл(1.txt) и вывести её на печать !?
Здравствуйте! Вопрос такой как при помощи FSO можно обработать такой (см.внизу)текстовый...

14
1281 / 912 / 446
Регистрация: 21.10.2012
Сообщений: 2,588
27.02.2019, 19:15 2
gglolpvp,
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
clc;  clear;
fid=fopen('Siga.txt');
i=1;
while ~(feof(fid))
m=fgetl(fid);
m=strrep(m,',','.');
sig(i,:)=str2num(m);
i=i+1;
end
fclose(fid);
 
n = length(sig);
FFTsig = fft(sig, n);
P2 = abs(FFTsig / n);
P1 = P2(1:n/2);
P1(2:end) = 2 * P1(2:end);
plot(P1);
1
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
27.02.2019, 19:43  [ТС] 3
АлександрКом,
Спасибо большое!!! Я пытался вычислить при помощи вот этого кода...
Апелируя различной частотой дискретизации и другими параметрами.
Matlab M
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
FlowRes = textscan('Siga','%f');
%% Параметры
Tm=10;% Длина сигнала (с)
Fd=1/60;% Частота дискретизации (Гц)
FftL=64;% Количество линий Фурье спектра
 
T=0:1/Fd:Tm-60;
Signal = (FlowRes')-120;
 
%% Спектральное представление сигнала
FftS=abs(fft(Signal,FftL));% Амплитуды преобразования Фурье сигнала
FftS=2*FftS./FftL;% Нормировка спектра по амплитуде
FftS(1)=FftS(1)/2;% Нормировка постоянной составляющей в спектре
 
%% Построение графиков
figure(1)
subplot(2,1,1);% Выбор области окна для построения
plot(T,Signal);% Построение сигнала
title('Сигнал');% Подпись графика
xlabel('Время (с)');% Подпись оси х графика
ylabel('Амплитуда (Попугаи)');% Подпись оси у графика
 
F=0:Fd/FftL:Fd/2-Fd/FftL;% Массив частот вычисляемого спектра Фурье
 
subplot(2,1,2);% Выбор области окна для построения
plot(F,FftS(1:length(F))),grid;% Построение спектра Фурье сигнала
title('Спектр сигнала');% Подпись графика
xlabel('Частота (Гц)');% Подпись оси х графика
ylabel('Амплитуда (Попугаи)');% Подпись оси у графика
Его я нашел здесь на форуме.
Мне не совсем понятна эта ошибка "Unable to perform assignment because the size of the left side is 1-by-1 and the size of the
right side is 0-by-0."

Я буду дальше изучать код, который вы написали)) Но при построение графика, мне опять не понятно его значения по осям x и y, что они буду означать в данном расчете? Подскажите?) И дайте пожалуйста совет, где и что почитать, для более глубокого освоения данной программы)

Посчитал другие расчеты с большим количеством точек, вот что получилось...
Что необходимо сделать если я на графике хочу видеть "Амплитуда" и "Частоту (Гц)"?
Миниатюры
Как получить спектр, имея текстовый файл с данными отсчетов оцифрованной акселерограммы при помощи преобразования Фурье   Как получить спектр, имея текстовый файл с данными отсчетов оцифрованной акселерограммы при помощи преобразования Фурье  
0
1281 / 912 / 446
Регистрация: 21.10.2012
Сообщений: 2,588
28.02.2019, 11:18 4
Цитата Сообщение от gglolpvp Посмотреть сообщение
"Unable to perform assignment because the size of the left side is 1-by-1 and the size of the
right side is 0-by-0."
Вы присваиваете переменной (размером 1х1) что-то пустое (размер 0х0).

Цитата Сообщение от gglolpvp Посмотреть сообщение
Что необходимо сделать если я на графике хочу видеть "Амплитуда" и "Частоту (Гц)"?
Амлитуду вы и так видите. Чтобы по оси абцисс были частоты в Гц, надо задать частоту дискретизации:
Matlab M
1
2
3
4
fs = 1/60;% Частота дискретизации (Гц)
F = 0: fs/n : fs/2 - fs/n;
 
plot(F, P1);
1
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
02.03.2019, 21:44  [ТС] 5
Здравствуйте! Спасибо Вам большое, у меня все получилось! Научился строить графики, задавать частоту дискретизации и время! Один из примеров прилагаю.
Я пошел дальше, начал изучать ifft, и сразу после построения графиков fft, написал такой алгоритм:
Matlab M
1
2
3
4
5
iP1 = ifft(P1);%обратное преобразование Фурье 
cy = real(iP1);%убрать шумы
Fs=500;%частота дискретизации
F=0:Fs/n:Fs/2-Fs/n;
plot(F,cy),title('Спектр отклика'),xlabel('Частота(Гц)'),ylabel('Амплитуда'),grid on
Ну и соответственно получилась акселерограмма.(График, который справа) Я все правильно сделал? Если открыть в MatLab файл с моими данными, и при помощи команды "plot" построить график, получится совсем иная акселерограмма.
И я не могу понять, как написать скрипт для этого алгоритма. Посоветуйте пожалуйста где почитать, чтобы стало ясно человеку, который никогда этим не занимался))
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
clc;  clear;
fid=fopen('Siga.txt');
i=1;
while ~(feof(fid))
m=fgetl(fid);
m=strrep(m,',','.');
sig(i,:)=str2num(m);
i=i+1;
end
fclose(fid);
 
n = length(sig);
FFTsig = fft(sig, n);
P2 = abs(FFTsig / n);
P1 = P2(1:n/2);
P1(2:end) = 2 * P1(2:end);
plot(P1);
Миниатюры
Как получить спектр, имея текстовый файл с данными отсчетов оцифрованной акселерограммы при помощи преобразования Фурье   Как получить спектр, имея текстовый файл с данными отсчетов оцифрованной акселерограммы при помощи преобразования Фурье  
1
1281 / 912 / 446
Регистрация: 21.10.2012
Сообщений: 2,588
04.03.2019, 11:28 6
gglolpvp, обратное преобразование Фурье нужно брать от сигнала, который получается сразу после прямого преобразования (сигнал FFTsig). Не нужно брать никаких действительных частей, сигнал и так получается вещственным. Взяв обратное преобразование Фурье, вы получаете представление сигнала во временной области. Не понятно, почему вы по оси абсцисс откладываете частоты, а не время. Для получения акселерограммы просто напишите:
Matlab M
1
newSig = ifft(FFTsig, n);
1
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
06.03.2019, 14:26  [ТС] 7
Спасибо! Все получилось! Буду работать дальше!

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fid=fopen('Siga.txt');
i=1;
while ~(feof(fid))
m=fgetl(fid);
m=strrep(m,',','.');
sig(i,:)=str2num(m);
i=i+1;
end
fclose(fid);
n = length(sig);
FFTsig = fft(sig,n);
P2 = abs(FFTsig / n);
P1 = P2(1:n/2);
P1(2:end) = 2 * P1(2:end);
Fs=100;
F=0:Fs/n:Fs/2-Fs/n;
figure
plot(F,P1),title('Спектр отклика'),xlabel('Частота(Гц)'),ylabel('Амплитуда'),grid on
Пытаюсь написать скрип, ничего не получается, при замене str2num на str2double появляется пустой график.
И смогу ли я в дальнейшем использовать этот расчет для построения графиков перемещения, ускорения и скоростей, нашел кучу скриптов, но пока не получается их применить к своим расчетам. Скрипты прикрепляю.
 Комментарий модератора 
Правила форума, пункт 2.3. Сообщения и темы, а также другой контент, размещаемый на форуме, по просьбам пользователей не удаляется и не закрывается.
Вложения
Тип файла: zip responseSpectra.zip (97.8 Кб, 12 просмотров)
Тип файла: zip SeismicRS.zip (102.3 Кб, 16 просмотров)
Тип файла: zip SPEC.zip (341.5 Кб, 10 просмотров)
Тип файла: zip OpenSeismoMatlab.zip (857.2 Кб, 13 просмотров)
0
1281 / 912 / 446
Регистрация: 21.10.2012
Сообщений: 2,588
07.03.2019, 10:38 8
Цитата Сообщение от gglolpvp Посмотреть сообщение
Пытаюсь написать скрип, ничего не получается, при замене str2num на str2double появляется пустой график.
Во-первых, зачем менять, а во-вторых, у меня в обоих случаях график строится.
0
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
11.03.2019, 09:24  [ТС] 9
Вот такая ошибка получается при написании скрипта :
Warning: Inputs must be character vectors, cell arrays of character vectors, or string
arrays.
> In My (line 5)

Error using str2num (line 35)
Input must be a character vector or string scalar.

Error in My (line 6)
sig(i,: )=str2num(m);
0
1281 / 912 / 446
Регистрация: 21.10.2012
Сообщений: 2,588
11.03.2019, 12:08 10
gglolpvp, не знаю, прикрепите файл сигнала...
0
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
11.03.2019, 12:15  [ТС] 11
Вот..
Вложения
Тип файла: txt Siga.txt (9.0 Кб, 12 просмотров)
0
1281 / 912 / 446
Регистрация: 21.10.2012
Сообщений: 2,588
11.03.2019, 13:34 12
gglolpvp, взял код из поста выше и ваш сигнал, всё работает, не знаю, в чем у вас ошибка.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fid=fopen('Siga.txt');
i=1;
while ~(feof(fid))
m=fgetl(fid);
m=strrep(m,',','.');
sig(i,:)=str2num(m);
i=i+1;
end
fclose(fid);
n = length(sig);
FFTsig = fft(sig,n);
P2 = abs(FFTsig / n);
P1 = P2(1:n/2);
P1(2:end) = 2 * P1(2:end);
Fs=100;
F=0:Fs/n:Fs/2-Fs/n;
figure
plot(F,P1),title('Спектр отклика'),xlabel('Частота(Гц)'),ylabel('Амплитуда'),grid on
1
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
11.03.2019, 15:01  [ТС] 13
Такое чувство, что у меня что то с программой, сейчас другая ошибка Не идет скрипт и все

Добавлено через 5 минут
А возможно все значения в файле Siga.txt преобразовать в вектора?
0
1281 / 912 / 446
Регистрация: 21.10.2012
Сообщений: 2,588
11.03.2019, 15:26 14
Цитата Сообщение от gglolpvp Посмотреть сообщение
преобразовать в вектора
Что именно хотите получить на выходе?
0
1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 16
11.03.2019, 15:34  [ТС] 15
Да, я с кодом разобрался, спасибо большое!!
Я создал новую тему, по "Спектру перемещений", https://www.cyberforum.ru/matlab/thread2416945.htm, есть расчет, но я не понимаю, как можно мой текстовый файл вставить в этот расчет. В общем не могу правильно задать начальные параметры.
0
11.03.2019, 15:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2019, 15:34
Помогаю со студенческими работами здесь

Получить фурье-спектр от одномерного сигнала
Всем привет! Разбираюсь с преобразование Фурье. Везде приводится разбор модельных сигналов,...

Как из Wav файла получить комплексные значения для быстрого преобразования Фурье?
Пишу программу для вывода спектра Wav файла Беру данные из Wav файла, прочел шапку, дошел до самих...

Дано текстовый файл f, строка s. Получить текстовый файл g, состоящий из строк файла f, содержащие как фрагмент строку s
Вопрос. Что от меня хотят в этом задании? Дано текстовый файл f, строка s. Получить текстовый файл...

Создать wav файл имея raw файл с данными
Всем хорошего настроения! Пишу программу для обработки аudio данных, и есть необходимость...

Написать функцию вычисляющую амплитудный спектр отсчетов звукового сигнала формата WAV
Нужно написать функцию вычисляющую амплитудный спектр отсчетов звукового сигнала формата WAV....

Имея лишь modulus и exponent зашифровать строку при помощи RSA
В общем, есть код на C#, и есть проект на C++. Нужно в этот проект встроить этот код. Проблемы в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru