Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 12

Взять fft от каждого столбца, а потом посчитать среднее арифметическое между столбцами.

27.05.2013, 13:41. Показов 1617. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте,

у меня есть вектор данных y, я разбил его на блоки M=buffer(y,1024), затем нужно взять fft от каждого столбца(вектора) ,а потом посчитать среднее арифметическое между столбцами.
Matlab M
1
2
3
4
y=y(:,2);
NFFT=1024
M=buffer(y,1024);
Y=fft(M,NFFT)/NFFT
не знаю как работать с циклами, и что бы Y считывал с каждого столбца
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2013, 13:41
Ответы с готовыми решениями:

В матрице посчитать среднее арифметическое каждого столбца
Используя процедуру в матрице целых чисел посчитать сред.арифм. каждой столбца матрицы и сформировать массив из ср.ариф.

Посчитать среднее арифметическое каждого столбца двухмерного массива
Посчитать среднее арифметическое каждого столбца двухмерного массива, и вывести значения в StringGrid в виде одномерного массива. ...

Посчитать среднее арифметическое положительных элементов каждого столбца
Помогите пожалуйста: Нужно посчитать среднее арифметическое положительных єлементов каждого столбца матрицы и напечатать результаты в виде...

13
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
27.05.2013, 14:04
функция fft работает с вектором, поэтому если на вход подать матрицу, где по столбцам будут расположены
твои буфферезированные данные, то на выходе ты получишь как разу матрицу, где в столбцах будет бпф по каждому блоку
2
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
27.05.2013, 15:46
так как мало что понятно, то и ответ соответствующий
Matlab M
1
2
3
4
5
6
y=y(:,2); 
NFFT=1024;
% формируем матрицу, где в каждом столбце по NFFT отсчетов
M = reshape(NFFT, length(y)/NFFT);
Y = fft(M,NFFT)/NFFT;
S = mean(M,1); % среднее каждого столбца
*тут важно, чтобы длинна вектора y была кратна NFFT!
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 12
27.05.2013, 16:04  [ТС]
В общем мне нада построить усредненный спектр сигнала,
разбив вектор на блоки потом fft от эти блоков(и их между собой усреднить, это наверно нада взять Среднее арифметическое не от столбцов, как я написал ,а от строчек.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> [y,Fs]=wavread('D:\wav1.wav','native');
>> N=2^floor(log(length(y))/log(2)); вот тут я выбрал max число отчетов для 2^p
>> N
 
N =
 
      262144
 
>> NFFT=1024;
>> y=y(:,2);
>> y=y(1:262144);
>> y=double(y);
>> M=buffer(y,NFFT);
>> size(M)
 
ans =
 
        1024         256
 
>> f=Fs/2.*linspace(0,1,NFFT/2);
>> Y=fft(M,NFFT)/NFFT;
>> plot(f,2*abs(Y(1:NFFT/2))),grid;
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
27.05.2013, 17:37
Matlab M
1
S = mean(Y,2);
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 12
28.05.2013, 22:08  [ТС]
Большое спасибо, все построилось.

Добавлено через 6 часов 24 минуты
есть еще небольшой вопрос из этой же темы,
имеется вектор строка S, мне нада создать новый вектор T и записать туда значения при условии, что
T(i)=10^(0.1*S(i)) if 18<S(i)<22.4
T(i)=10^(0.1*S(i)) if 22,4<S(i)<28

вот пример из mathcad


это перевод из третьоктавные значения частоты
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
28.05.2013, 22:52
Цитата Сообщение от Dmitry28 Посмотреть сообщение
есть еще небольшой вопрос из этой же темы,
имеется вектор строка S, мне нада создать новый вектор T и записать туда значения при условии, что
T(i)=10^(0.1*S(i)) if 18<S(i)<22.4
T(i)=10^(0.1*S(i)) if 22.4<S(i)<28
Вообще-то так:
Matlab M
1
T = (10.^(0.1*S)).*((18<=S)&(S<22.4)) + (10.^(0.1*S)).*((22.4<=S)&(S<28));
Однако, я не вижу в этом смысла, так как для разных условий, выражения одинаковы!
0
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 12
29.05.2013, 10:53  [ТС]
Цитата Сообщение от Зосима Посмотреть сообщение
для разных условий, выражения одинаковы
но значения разные

нужно, что бы считывалось с каждого столбца (изначально у меня 512 частот, а в итоге должно остаться около 30),
то есть
T(1)=10^(0.1*S(1,15)) if 18<S(1,15)<22.4 S(i,j)*
T(2)=10^(0.1*S(1,15)) if 22.4<S(1,18)<28

что, то вроде этого, извините, не знаю как правильно записать
for i=1:12
T(1)=10^(0.1*S(1,i)) if 18<S(1,i)<22.4 и так перебирая matlab выбрал нужные )
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
29.05.2013, 15:03
Что такое Т(1) и Т(2)?

Не по теме:

ведь если в него вписывается несколько значений, то это не может быть числом, значит это должны быть массивы, тогда Т - двустолбцовая матрица, но тогда кол-во элементов в Т(1) и Т(2) должны быть равны.... :scratch:

0
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 12
30.05.2013, 01:53  [ТС]
да я все переврал там...не правильно.

попробую пояснить заново и как должно быть :P

есть вектор Частот f, ему соответствует вектор амплитуд S
f=[ 17,4979, 18.8439, 20.1898, 21.5358, 22.8818, 24.2278, 25.5738 ..]
S=[10,2203, 9.3661 , 9.4035 , 9.5820 , 8.9503 , 8.9035 , 9.9098 ..]

на примере ((18<=f)&(f<22.4));
сюда попадают 3 Частоты из f(18.8439 20.1898 21.5358 ), тогда мне нужно сложить Амплитуды из вектора S на этих частотах (9.3661 9.4035 9.5820 ), то есть T1=9.3661+9.4035+9.5820
и так дальее для ((22.4<=f)&(f<28)), T2=8.9503+8.9035+9.9098 для f(22.8818 24.2278 25.5738)

в итоге должно получиться около 30 значенийй амплитуд(T1,T2..Tn), которые уже в ручную можно записать в массив
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
30.05.2013, 08:29
Т.е. так чтоли?
Matlab M
1
2
 T(1) = sum( S( (18<=F)&(F<=22) ) );
T(2) = sum( S( (22<F)&(F<=28) ) );
Добавлено через 1 минуту
А по какому принципу выбираются границы поддиапазонов?
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 12
30.05.2013, 13:37  [ТС]
это границы для 1/3окт. значений взятые из Госта. http://tehnorma.ru/normativbase/53/53297/index.htm таблица 1
Мне нужно просуммировать значения из вектора S, которые соответствуют частотам попавшим в диапазон (для каждого T он свой).
В общем я ищу значения Амплитуд на 1/3окт значениях, а сами значения частоты(1/3 окт) я задам потом сам.

длины векторов разумеется, равны, f(i,j) соответствует значениям S(i,j) или (1,j) т.к у меня вектор строка.
T1 = sum( S( (18<=F)&(F<=22.4) ) ); в этом дипазоне будет частота 20Гц
T2 = sum( S( (22<F)&(F<=28) ) ); 25 Гц
T3 = sum( S( (28<=F)&(F<=35.5) ) ); 31,5 Гц
T4 = sum( S( (35.5<F)&(F<=45) ) ); 40 Гц
T5 = sum( S( (45<=F)&(F<=56) ) ); 50 Гц
...
T30 = sum( S( (18000<=F)&(F<=22000) ) ) 20000 Гц
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
30.05.2013, 14:24
а эти граничные частоты fmin, fmax можно выразить формулой?

Добавлено через 2 минуты
или где взять полный список частот? (в ГОСТе не нашел 18...22.4, 22.4...28 и т.п. )

Добавлено через 5 минут
Другими словами я хочу сделать такую конструкцию:
Matlab M
1
2
3
4
fgr = [18 22 28 35 45 56];
for i = 1:length(fgr)-1
  T(i) = sum( S( (fgr(i)<=F)&(F<=fgr(i+1)) ) );
end
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 12
30.05.2013, 15:06  [ТС]
Цитата Сообщение от Зосима Посмотреть сообщение
1
2
*T(1) = sum( S( (18<=F)&(F<=22) ) );
T(2) = sum( S( (22<F)&(F<=28) ) );
только сейчас построил вроде то, что нужно , думал что нада индексировать вектор и прочее, а оказалось куда проще
Спасибо еще раз

Цитата Сообщение от Зосима Посмотреть сообщение
а эти граничные частоты fmin, fmax можно выразить формулой?
что бы получить значения ниже просто делите на 2
44 50 56, тогда 22 25 28 и т.д.
из ГОСТа третьоктавная полоса (one-third-octave band): Диапазон частот, в котором верхняя частота равна нижней частоте, умноженной на кубический корень из двух (приблизительно на 1,26)
Цитата Сообщение от Зосима Посмотреть сообщение
1
2
3
4
fgr = [18 22 28 35 45 56];
for i = 1:length(fgr)-1
* T(i) = sum( S( (fgr(i)<=F)&(F<=fgr(i+1)) ) );
end
ну я пошел по первому пути и вычислил эти 30 значений, благо их не так много, и я ожидал что-то вроде такого кода, как последний

Добавлено через 14 минут
.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2013, 15:06
Помогаю со студенческими работами здесь

Среднее арифметическое каждого столбца матрицы
Пользователь вводит размер матрицы то есть mas (x-ряды, у-столбцы), найти среднее арифметическое каждого столбца матрицы

Среднее арифметическое каждого столбца матрицы
Уважаемые форумчани. Мне по информатике задали задачу для решения на python с использованием циклов. Но так как я не разбираюсь в этом...

Среднее арифметическое каждого столбца матрицы
Составьте пограмму вычисления среднего арифметического каждого столбца матрицы A(N,N) и запишите данные значения в главную диагональ данной...

Среднее арифметическое каждого столбца матрицы
Помогите пожалуйста, нужно для заданной прямоугольной матрицы А вывести вектор B, где B(i) среднее арифметическое положительных элементов в...

Найти среднее арифметическое каждого столбца
Нужно найти среднее арифметическое каждого столбца вот код: const n = 4; m = 5; var Mat: array of integer; ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru