diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..797c8e5 --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# Database Configuration +DATABASE_HOST=localhost +DATABASE_PORT=3306 +DATABASE_NAME=audio +DATABASE_USER=root +DATABASE_PASSWORD=root123 + +# Application Settings +APP_NAME=Audio Dashboard API +DEBUG=True + +# Meilisearch Configuration +MEILISEARCH_URL=http://ec2-18-184-205-87.eu-central-1.compute.amazonaws.com:7700 +MEILISEARCH_API_KEY=young9#!UJsD219921031 +MEILISEARCH_INDEX=models diff --git a/autoeq/measurements/Eafonyoung/data/in-ear/FiiO FA19.csv b/autoeq/measurements/Eafonyoung/data/in-ear/FiiO FA19.csv new file mode 100644 index 0000000..0766b8f --- /dev/null +++ b/autoeq/measurements/Eafonyoung/data/in-ear/FiiO FA19.csv @@ -0,0 +1,481 @@ +frequency,raw +20.0,77.772 +20.299999,77.867 +20.6,77.95 +20.9,78.022 +21.200001,78.086 +21.4,78.125 +21.799999,78.202 +22.0,78.241 +22.4,78.323 +22.700001,78.39 +23.0,78.462 +23.299999,78.536 +23.6,78.61 +24.0,78.703 +24.299999,78.764 +24.700001,78.83 +25.0,78.868 +25.4,78.904 +25.799999,78.929 +26.200001,78.947 +26.5,78.96 +26.9,78.978 +27.200001,78.995 +27.6,79.023 +28.0,79.058 +28.5,79.111 +29.0,79.172 +29.5,79.236 +30.0,79.297 +30.4,79.34 +30.700001,79.366 +31.1,79.393 +31.5,79.407 +32.0,79.412 +32.5,79.405 +33.0,79.395 +33.5,79.386 +34.0,79.383 +34.5,79.385 +35.0,79.391 +35.5,79.401 +36.0,79.413 +36.5,79.429 +37.0,79.447 +37.5,79.467 +38.200001,79.494 +38.700001,79.512 +39.5,79.536 +40.0,79.55 +40.599998,79.564 +41.200001,79.578 +41.799999,79.59 +42.5,79.6 +43.099998,79.605 +43.700001,79.606 +44.400002,79.603 +45.0,79.599 +45.5,79.594 +46.200001,79.586 +46.799999,79.58 +47.5,79.572 +48.200001,79.565 +48.700001,79.56 +49.400002,79.553 +50.0,79.548 +50.799999,79.539 +51.5,79.53 +52.200001,79.518 +53.0,79.503 +53.799999,79.485 +54.5,79.468 +55.200001,79.451 +56.0,79.43 +57.0,79.405 +58.0,79.379 +59.0,79.354 +60.0,79.326 +60.799999,79.301 +61.5,79.277 +62.200001,79.252 +63.0,79.222 +64.0,79.184 +65.0,79.147 +66.0,79.111 +67.0,79.076 +68.0,79.042 +69.0,79.008 +70.0,78.973 +71.0,78.937 +72.0,78.9 +73.0,78.863 +74.0,78.824 +75.0,78.786 +76.199997,78.74 +77.5,78.693 +78.800003,78.647 +80.0,78.607 +81.199997,78.567 +82.5,78.524 +83.800003,78.479 +85.0,78.435 +86.199997,78.391 +87.5,78.34 +88.5,78.3 +90.0,78.239 +91.199997,78.19 +92.5,78.136 +93.800003,78.083 +95.0,78.034 +96.199997,77.985 +97.5,77.932 +98.800003,77.88 +100.0,77.832 +101.5,77.773 +103.0,77.716 +104.400002,77.663 +106.0,77.604 +107.5,77.55 +109.0,77.497 +110.599998,77.442 +112.0,77.395 +113.800003,77.335 +115.0,77.296 +117.199997,77.221 +118.0,77.193 +120.599998,77.1 +122.0,77.048 +124.099998,76.97 +125.0,76.937 +126.5,76.882 +128.0,76.828 +131.5,76.705 +132.0,76.688 +134.0,76.62 +136.0,76.554 +138.0,76.49 +140.0,76.428 +143.0,76.337 +145.0,76.277 +147.5,76.203 +150.0,76.128 +152.5,76.051 +155.0,75.973 +157.5,75.896 +160.0,75.821 +162.5,75.748 +165.0,75.677 +167.5,75.608 +170.0,75.542 +172.5,75.477 +175.0,75.413 +177.5,75.349 +180.0,75.286 +182.5,75.222 +185.0,75.157 +187.5,75.091 +190.0,75.025 +192.5,74.958 +195.0,74.892 +197.5,74.827 +200.0,74.763 +203.0,74.687 +206.0,74.614 +209.0,74.543 +212.0,74.474 +214.0,74.429 +218.0,74.342 +220.0,74.299 +224.0,74.213 +227.0,74.15 +230.0,74.086 +233.0,74.023 +236.0,73.96 +240.0,73.878 +243.0,73.817 +247.0,73.738 +250.0,73.681 +254.0,73.608 +258.0,73.539 +262.0,73.473 +265.0,73.425 +269.0,73.362 +272.0,73.315 +276.0,73.252 +280.0,73.189 +285.0,73.11 +290.0,73.032 +295.0,72.954 +300.0,72.878 +304.0,72.819 +307.0,72.776 +311.0,72.721 +315.0,72.668 +320.0,72.606 +325.0,72.547 +330.0,72.49 +335.0,72.436 +340.0,72.383 +345.0,72.332 +350.0,72.282 +355.0,72.235 +360.0,72.19 +365.0,72.148 +370.0,72.108 +375.0,72.07 +382.0,72.019 +387.0,71.985 +395.0,71.93 +400.0,71.897 +406.0,71.856 +412.0,71.814 +418.0,71.77 +425.0,71.718 +431.0,71.673 +437.0,71.629 +444.0,71.578 +450.0,71.535 +455.0,71.5 +462.0,71.45 +468.0,71.408 +475.0,71.358 +482.0,71.309 +487.0,71.273 +494.0,71.225 +500.0,71.185 +508.0,71.134 +515.0,71.093 +522.0,71.055 +530.0,71.015 +538.0,70.977 +545.0,70.946 +552.0,70.917 +560.0,70.885 +570.0,70.847 +580.0,70.812 +590.0,70.779 +600.0,70.748 +608.0,70.724 +615.0,70.703 +622.0,70.682 +630.0,70.66 +640.0,70.634 +650.0,70.611 +660.0,70.591 +670.0,70.574 +680.0,70.559 +690.0,70.545 +700.0,70.533 +710.0,70.521 +720.0,70.511 +730.0,70.503 +740.0,70.496 +750.0,70.493 +762.0,70.492 +775.0,70.497 +788.0,70.51 +800.0,70.528 +812.0,70.553 +825.0,70.586 +838.0,70.625 +850.0,70.664 +862.0,70.705 +875.0,70.752 +885.0,70.789 +900.0,70.846 +912.0,70.895 +925.0,70.952 +938.0,71.014 +950.0,71.076 +962.0,71.144 +975.0,71.225 +988.0,71.31 +1000.0,71.394 +1015.0,71.502 +1030.0,71.613 +1044.0,71.718 +1060.0,71.837 +1075.0,71.947 +1090.0,72.054 +1106.0,72.165 +1120.0,72.259 +1138.0,72.376 +1150.0,72.452 +1172.0,72.585 +1180.0,72.632 +1206.0,72.777 +1220.0,72.853 +1241.0,72.963 +1250.0,73.009 +1265.0,73.086 +1280.0,73.161 +1315.0,73.332 +1320.0,73.355 +1340.0,73.446 +1360.0,73.533 +1380.0,73.614 +1400.0,73.69 +1430.0,73.8 +1450.0,73.871 +1475.0,73.958 +1500.0,74.044 +1525.0,74.129 +1550.0,74.211 +1575.0,74.292 +1600.0,74.372 +1625.0,74.452 +1650.0,74.533 +1675.0,74.616 +1700.0,74.698 +1725.0,74.781 +1750.0,74.863 +1775.0,74.944 +1800.0,75.022 +1825.0,75.1 +1850.0,75.176 +1875.0,75.252 +1900.0,75.329 +1925.0,75.405 +1950.0,75.481 +1975.0,75.555 +2000.0,75.628 +2030.0,75.714 +2060.0,75.797 +2090.0,75.881 +2120.0,75.964 +2140.0,76.021 +2180.0,76.138 +2200.0,76.199 +2240.0,76.325 +2270.0,76.423 +2300.0,76.525 +2330.0,76.629 +2360.0,76.735 +2400.0,76.877 +2430.0,76.982 +2470.0,77.116 +2500.0,77.211 +2540.0,77.327 +2580.0,77.432 +2620.0,77.526 +2650.0,77.591 +2690.0,77.671 +2720.0,77.729 +2760.0,77.803 +2800.0,77.877 +2850.0,77.971 +2900.0,78.067 +2950.0,78.162 +3000.0,78.252 +3040.0,78.314 +3070.0,78.354 +3110.0,78.393 +3150.0,78.413 +3200.0,78.403 +3250.0,78.348 +3300.0,78.239 +3350.0,78.071 +3400.0,77.841 +3450.0,77.552 +3500.0,77.207 +3550.0,76.814 +3600.0,76.384 +3650.0,75.93 +3700.0,75.469 +3750.0,75.019 +3820.0,74.449 +3870.0,74.113 +3950.0,73.74 +4000.0,73.624 +4060.0,73.6 +4120.0,73.686 +4180.0,73.857 +4250.0,74.132 +4310.0,74.408 +4370.0,74.706 +4440.0,75.068 +4500.0,75.385 +4550.0,75.65 +4620.0,76.02 +4680.0,76.333 +4750.0,76.69 +4820.0,77.032 +4870.0,77.263 +4940.0,77.562 +5000.0,77.789 +5080.0,78.041 +5150.0,78.205 +5220.0,78.312 +5300.0,78.361 +5380.0,78.334 +5450.0,78.252 +5520.0,78.122 +5600.0,77.924 +5700.0,77.622 +5800.0,77.285 +5900.0,76.942 +6000.0,76.621 +6080.0,76.397 +6150.0,76.235 +6220.0,76.114 +6300.0,76.03 +6400.0,76.017 +6500.0,76.11 +6600.0,76.303 +6700.0,76.577 +6800.0,76.902 +6900.0,77.243 +7000.0,77.56 +7100.0,77.82 +7200.0,77.994 +7300.0,78.062 +7400.0,78.012 +7500.0,77.842 +7620.0,77.489 +7750.0,76.952 +7880.0,76.308 +8000.0,75.677 +8120.0,75.077 +8250.0,74.531 +8380.0,74.152 +8500.0,73.975 +8620.0,73.954 +8750.0,74.072 +8850.0,74.228 +9000.0,74.516 +9120.0,74.758 +9250.0,75.009 +9380.0,75.242 +9500.0,75.439 +9620.0,75.62 +9750.0,75.799 +9880.0,75.963 +10000.0,76.1 +10150.0,76.251 +10300.0,76.378 +10440.0,76.474 +10600.0,76.554 +10750.0,76.593 +10900.0,76.59 +11060.0,76.527 +11200.0,76.411 +11380.0,76.167 +11500.0,75.941 +11720.0,75.393 +11800.0,75.154 +12060.0,74.263 +12200.0,73.737 +12410.0,72.947 +12500.0,72.627 +12650.0,72.147 +12800.0,71.763 +13150.0,71.378 +13200.0,71.386 +13400.0,71.559 +13600.0,71.921 +13800.0,72.421 +14000.0,73.022 +14300.0,74.052 +14500.0,74.785 +14750.0,75.691 +15000.0,76.511 +15250.0,77.17 +15500.0,77.613 +15750.0,77.81 +16000.0,77.761 +16250.0,77.477 +16500.0,76.978 +16750.0,76.277 +17000.0,75.384 +17250.0,74.308 +17500.0,73.062 +17750.0,71.667 +18000.0,70.149 +18250.0,68.54 +18500.0,66.877 +18750.0,65.194 +19000.0,63.532 +19250.0,61.938 +19500.0,60.478 +19750.0,59.285 diff --git a/backend/.gitignore b/backend/.gitignore index 4a8f42a..4e7c0c6 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -36,3 +36,4 @@ wheels/ # Logs *.log +logs/ diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..73f5bdd --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.11-slim + +WORKDIR /app + +# Create logs directory +RUN mkdir -p /app/logs + +# Install dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy application code +COPY . . + +# Expose port +EXPOSE 8000 + +# Run the application +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/database.py b/backend/database.py index da4bf67..0409ec0 100644 --- a/backend/database.py +++ b/backend/database.py @@ -14,13 +14,15 @@ DATABASE_NAME = os.getenv("DATABASE_NAME", "audio") DATABASE_USER = os.getenv("DATABASE_USER", "root") DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD", "root123") -# Create database URL (same format as working code) +# Create database URL (only charset parameter) DATABASE_URL = f"mysql+pymysql://{DATABASE_USER}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_NAME}?charset=utf8mb4" -# Create engine (same config as working code) +# Create engine with additional connection arguments +# Use connect_args for parameters that shouldn't be in the URL engine = create_engine( DATABASE_URL, - echo=os.getenv("DEBUG", "False") == "True" + echo=os.getenv("DEBUG", "False") == "True", + connect_args={} ) # Create session factory diff --git a/backend/main.py b/backend/main.py index e8507bf..349d09a 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,6 +1,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware import os +import logging from dotenv import load_dotenv from database import engine, Base @@ -9,12 +10,25 @@ from routes import brands_router, models_router # Load environment variables load_dotenv() +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(), # 输出到控制台 + logging.FileHandler('logs/app.log', encoding='utf-8') # 输出到文件 + ] +) +logger = logging.getLogger(__name__) + # Create database tables (only if tables don't exist) try: + logger.info("Creating database tables...") Base.metadata.create_all(bind=engine) + logger.info("Database tables created successfully") except Exception as e: - print(f"Warning: Could not create tables: {e}") - print("Continuing without table creation...") + logger.error(f"Warning: Could not create tables: {e}") + logger.error("Continuing without table creation...") # Create FastAPI app app = FastAPI( diff --git a/backend/requirements.txt b/backend/requirements.txt index 706af28..5286ba2 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,7 +1,9 @@ fastapi==0.104.1 sqlalchemy==2.0.23 -pymysql==1.1.0 +pymysql==1.1.1 cryptography==41.0.7 pydantic==2.5.2 uvicorn==0.24.0 python-dotenv==1.0.0 +requests==2.31.0 +python-multipart==0.0.6 diff --git a/backend/routes/brands.py b/backend/routes/brands.py index 5e462a4..51e2931 100644 --- a/backend/routes/brands.py +++ b/backend/routes/brands.py @@ -1,11 +1,15 @@ from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from typing import List, Optional +import logging from database import get_db from models.brand import Brand from schemas import BrandCreate, BrandUpdate, BrandResponse from response import ApiResponse, PageData +# Configure logging +logger = logging.getLogger(__name__) + router = APIRouter(prefix="/api/brands", tags=["brands"]) @@ -18,6 +22,7 @@ def get_brands( ): """获取所有品牌列表(支持按名称模糊查询)""" try: + logger.info(f"Getting brands: skip={skip}, limit={limit}, name={name}") query = db.query(Brand) if name: query = query.filter(Brand.name.like(f"%{name}%")) @@ -25,7 +30,10 @@ def get_brands( total = query.count() brands = query.offset(skip).limit(limit).all() + logger.info(f"Found {len(brands)} brands, total={total}") + if not brands: + logger.warning("No brands found") return ApiResponse(code=2, msg="empty", data=None) # 转换为字典列表 @@ -33,6 +41,7 @@ def get_brands( return ApiResponse(code=1, msg="success", data={"items": brands_data, "total": total, "skip": skip, "limit": limit}) except Exception as e: + logger.error(f"Error getting brands: {str(e)}", exc_info=True) return ApiResponse(code=0, msg="error", data=None) @@ -40,11 +49,15 @@ def get_brands( def get_brand(brand_id: int, db: Session = Depends(get_db)): """获取单个品牌""" try: + logger.info(f"Getting brand: id={brand_id}") brand = db.query(Brand).filter(Brand.id == brand_id).first() if not brand: + logger.warning(f"Brand not found: id={brand_id}") return ApiResponse(code=2, msg="empty", data=None) + logger.info(f"Brand found: {brand.to_dict()}") return ApiResponse(code=1, msg="success", data=brand.to_dict()) except Exception as e: + logger.error(f"Error getting brand {brand_id}: {str(e)}", exc_info=True) return ApiResponse(code=0, msg="error", data=None) @@ -52,17 +65,21 @@ def get_brand(brand_id: int, db: Session = Depends(get_db)): def create_brand(brand: BrandCreate, db: Session = Depends(get_db)): """创建新品牌""" try: + logger.info(f"Creating brand: name={brand.name}") # 检查是否已存在 existing = db.query(Brand).filter(Brand.name == brand.name).first() if existing: + logger.warning(f"Brand already exists: name={brand.name}") return ApiResponse.error(msg="品牌名称已存在", code=0) db_brand = Brand(name=brand.name) db.add(db_brand) db.commit() db.refresh(db_brand) + logger.info(f"Brand created successfully: id={db_brand.id}, name={db_brand.name}") return ApiResponse.success(data=db_brand.to_dict(), msg="品牌创建成功") except Exception as e: + logger.error(f"Error creating brand: {str(e)}", exc_info=True) db.rollback() return ApiResponse.error(msg=f"创建失败:{str(e)}", code=0) @@ -71,21 +88,26 @@ def create_brand(brand: BrandCreate, db: Session = Depends(get_db)): def update_brand(brand_id: int, brand: BrandUpdate, db: Session = Depends(get_db)): """更新品牌""" try: + logger.info(f"Updating brand: id={brand_id}, data={brand.dict()}") db_brand = db.query(Brand).filter(Brand.id == brand_id).first() if not db_brand: + logger.warning(f"Brand not found: id={brand_id}") return ApiResponse.no_data(msg="品牌不存在") # 如果更新名称,检查是否冲突 if brand.name and brand.name != db_brand.name: existing = db.query(Brand).filter(Brand.name == brand.name).first() if existing: + logger.warning(f"Brand name already exists: name={brand.name}") return ApiResponse.error(msg="品牌名称已存在", code=0) db_brand.name = brand.name db.commit() db.refresh(db_brand) + logger.info(f"Brand updated successfully: id={db_brand.id}") return ApiResponse.success(data=db_brand.to_dict(), msg="品牌更新成功") except Exception as e: + logger.error(f"Error updating brand {brand_id}: {str(e)}", exc_info=True) db.rollback() return ApiResponse.error(msg=f"更新失败:{str(e)}", code=0) @@ -94,13 +116,17 @@ def update_brand(brand_id: int, brand: BrandUpdate, db: Session = Depends(get_db def delete_brand(brand_id: int, db: Session = Depends(get_db)): """删除品牌""" try: + logger.info(f"Deleting brand: id={brand_id}") db_brand = db.query(Brand).filter(Brand.id == brand_id).first() if not db_brand: + logger.warning(f"Brand not found: id={brand_id}") return ApiResponse.no_data(msg="品牌不存在") db.delete(db_brand) db.commit() + logger.info(f"Brand deleted successfully: id={brand_id}") return ApiResponse.success(msg="删除成功") except Exception as e: + logger.error(f"Error deleting brand {brand_id}: {str(e)}", exc_info=True) db.rollback() return ApiResponse.error(msg=f"删除失败:{str(e)}", code=0) diff --git a/backend/routes/models.py b/backend/routes/models.py index e4d5de3..1e9878b 100644 --- a/backend/routes/models.py +++ b/backend/routes/models.py @@ -1,12 +1,18 @@ -from fastapi import APIRouter, Depends, HTTPException, Query, Body +from fastapi import APIRouter, Depends, HTTPException, Query, Body, UploadFile, File, Form from sqlalchemy.orm import Session from typing import List, Optional +import logging from database import get_db from models.model import Model from schemas import ModelCreate, ModelUpdate, ModelResponse from response import ApiResponse, PageData import requests import os +import shutil +from pathlib import Path + +# Configure logging +logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/models", tags=["models"]) @@ -15,6 +21,10 @@ MEILISEARCH_URL = os.getenv("MEILISEARCH_URL", "http://localhost:7700") MEILISEARCH_API_KEY = os.getenv("MEILISEARCH_API_KEY", "") MEILISEARCH_INDEX = os.getenv("MEILISEARCH_INDEX", "models") +# 文件上传配置 +UPLOAD_FOLDER = Path(__file__).parent.parent.parent / "autoeq" / "measurements" +ALLOWED_EXTENSIONS = {'.csv', '.txt', '.json'} + @router.get("/", response_model=ApiResponse) def get_models( @@ -26,6 +36,7 @@ def get_models( ): """获取所有型号列表(支持按品牌名称和型号名称模糊查询)""" try: + logger.info(f"Getting models: skip={skip}, limit={limit}, brand_name={brand_name}, name={name}") query = db.query(Model) if brand_name: query = query.filter(Model.brand_name.like(f"%{brand_name}%")) @@ -35,7 +46,10 @@ def get_models( total = query.count() models = query.offset(skip).limit(limit).all() + logger.info(f"Found {len(models)} models, total={total}") + if not models: + logger.warning("No models found") return ApiResponse(code=2, msg="empty", data=None) # 转换为字典列表 @@ -43,6 +57,7 @@ def get_models( return ApiResponse(code=1, msg="success", data={"items": models_data, "total": total, "skip": skip, "limit": limit}) except Exception as e: + logger.error(f"Error getting models: {str(e)}", exc_info=True) return ApiResponse(code=0, msg="error", data=None) @@ -50,39 +65,78 @@ def get_models( def get_model(model_id: int, db: Session = Depends(get_db)): """获取单个型号""" try: + logger.info(f"Getting model: id={model_id}") model = db.query(Model).filter(Model.id == model_id).first() if not model: + logger.warning(f"Model not found: id={model_id}") return ApiResponse(code=2, msg="empty", data=None) + logger.info(f"Model found: {model.to_dict()}") return ApiResponse(code=1, msg="success", data=model.to_dict()) except Exception as e: + logger.error(f"Error getting model {model_id}: {str(e)}", exc_info=True) return ApiResponse(code=0, msg="error", data=None) @router.post("/", response_model=ApiResponse) -def create_model(model: ModelCreate, db: Session = Depends(get_db)): - """创建新型号""" +def create_model( + brand_name: str = Form(...), + name: str = Form(...), + form: str = Form(None), + rig: str = Form(None), + source: str = Form(None), + eq_key: str = Form(None), + measurement_file: UploadFile = File(None), + db: Session = Depends(get_db) +): + """创建新型号(支持文件上传)""" try: + logger.info(f"Creating model: brand_name={brand_name}, name={name}, form={form}, source={source}") # 检查是否已存在 existing = db.query(Model).filter( - Model.brand_name == model.brand_name, - Model.name == model.name + Model.brand_name == brand_name, + Model.name == name ).first() if existing: + logger.warning(f"Model already exists: brand_name={brand_name}, name={name}") return ApiResponse(code=0, msg="该品牌下型号名称已存在", data=None) + # 处理文件上传 + measurement_filename = None + if measurement_file and measurement_file.filename: + logger.info(f"Uploading measurement file: {measurement_file.filename}") + # 验证文件扩展名 + file_ext = os.path.splitext(measurement_file.filename)[1].lower() + if file_ext not in ALLOWED_EXTENSIONS: + logger.error(f"Unsupported file format: {file_ext}") + return ApiResponse(code=0, msg=f"不支持的文件格式:{file_ext}", data=None) + + # 创建保存路径:autoeq/measurements/{source}/data/{form}/{filename} + save_dir = UPLOAD_FOLDER / source / "data" / form + save_dir.mkdir(parents=True, exist_ok=True) + + # 保存文件(保留原文件名) + file_path = save_dir / measurement_file.filename + with open(file_path, "wb") as buffer: + shutil.copyfileobj(measurement_file.file, buffer) + + measurement_filename = measurement_file.filename + logger.info(f"File saved: {file_path}") + db_model = Model( - brand_name=model.brand_name, - name=model.name, - form=model.form, - rig=model.rig, - source=model.source, - eq_key=model.eq_key + brand_name=brand_name, + name=name, + form=form, + rig=rig, + source=source, + eq_key=eq_key ) db.add(db_model) db.commit() db.refresh(db_model) + logger.info(f"Model created successfully: id={db_model.id}") return ApiResponse(code=1, msg="success", data=db_model.to_dict()) except Exception as e: + logger.error(f"Error creating model: {str(e)}", exc_info=True) db.rollback() return ApiResponse(code=0, msg="error", data=None) @@ -91,8 +145,10 @@ def create_model(model: ModelCreate, db: Session = Depends(get_db)): def update_model(model_id: int, model: ModelUpdate, db: Session = Depends(get_db)): """更新型号""" try: + logger.info(f"Updating model: id={model_id}, data={model.dict()}") db_model = db.query(Model).filter(Model.id == model_id).first() if not db_model: + logger.warning(f"Model not found: id={model_id}") return ApiResponse(code=2, msg="empty", data=None) # 如果更新品牌或型号名称,检查是否冲突 @@ -106,6 +162,7 @@ def update_model(model_id: int, model: ModelUpdate, db: Session = Depends(get_db Model.name == new_name ).first() if existing: + logger.warning(f"Model already exists: brand_name={new_brand_name}, name={new_name}") return ApiResponse(code=0, msg="该品牌下型号名称已存在", data=None) # 更新字段 @@ -124,8 +181,10 @@ def update_model(model_id: int, model: ModelUpdate, db: Session = Depends(get_db db.commit() db.refresh(db_model) + logger.info(f"Model updated successfully: id={db_model.id}") return ApiResponse(code=1, msg="success", data=db_model.to_dict()) except Exception as e: + logger.error(f"Error updating model {model_id}: {str(e)}", exc_info=True) db.rollback() return ApiResponse(code=0, msg="error", data=None) @@ -134,14 +193,18 @@ def update_model(model_id: int, model: ModelUpdate, db: Session = Depends(get_db def delete_model(model_id: int, db: Session = Depends(get_db)): """删除型号""" try: + logger.info(f"Deleting model: id={model_id}") db_model = db.query(Model).filter(Model.id == model_id).first() if not db_model: + logger.warning(f"Model not found: id={model_id}") return ApiResponse(code=2, msg="empty", data=None) db.delete(db_model) db.commit() + logger.info(f"Model deleted successfully: id={model_id}") return ApiResponse(code=1, msg="success", data=None) except Exception as e: + logger.error(f"Error deleting model {model_id}: {str(e)}", exc_info=True) db.rollback() return ApiResponse(code=0, msg="error", data=None) diff --git a/convert_to_frequency_db.py b/convert_to_frequency_db.py new file mode 100644 index 0000000..ff82892 --- /dev/null +++ b/convert_to_frequency_db.py @@ -0,0 +1,163 @@ +import cv2 +import numpy as np +import matplotlib.pyplot as plt +import json + +# 读取图片 +img_path = r"C:\Users\yangy\.cursor\projects\h-soft-projects-luxsin-dashboard/assets/c__Users_yangy_AppData_Roaming_Cursor_User_workspaceStorage_b134a9df77916b35c1e5b1ece8dc14fe_images_Arcona-avg-0b78da44-4aaa-465b-9b2b-fba051a28742.png" +img = cv2.imread(img_path) +img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) +img_copy = img.copy() +gray = cv2.cvtColor(img_copy, cv2.COLOR_RGB2GRAY) + +height, width = gray.shape +print(f"图片尺寸:{height}x{width}") + +# 定义图表区域 +chart_top = int(height * 0.05) +chart_bottom = int(height * 0.92) +chart_left = int(width * 0.02) +chart_right = int(width * 0.98) + +chart_height = chart_bottom - chart_top +chart_width = chart_right - chart_left + +print(f"图表区域:top={chart_top}, bottom={chart_bottom}, left={chart_left}, right={chart_right}") +print(f"图表尺寸:{chart_width}x{chart_height}") + +# 频率轴映射(对数刻度) +# 从图中可以看到:20Hz 在最左边,20kHz 在最右边 +# 使用对数刻度映射 +freq_min = 20 # Hz +freq_max = 20000 # Hz + +# dB 轴映射(线性刻度) +# 从图中可以看到:顶部约 120dB,底部约 70dB +db_max = 120 # 图表顶部对应的 dB 值(y 坐标最小) +db_min = 70 # 图表底部对应的 dB 值(y 坐标最大) + +# 提取白色线条 +chart_roi = gray[chart_top:chart_bottom, chart_left:chart_right] +_, thresh = cv2.threshold(chart_roi, 200, 255, cv2.THRESH_BINARY) + +kernel = np.ones((3,3), np.uint8) +dilated_thresh = cv2.dilate(thresh, kernel, iterations=2) +eroded_thresh = cv2.erode(dilated_thresh, kernel, iterations=1) + +contours, _ = cv2.findContours(eroded_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + +largest_contour = None +max_area = 0 +for contour in contours: + area = cv2.contourArea(contour) + if area > max_area: + max_area = area + largest_contour = contour + +frequency_data = [] + +if largest_contour is not None: + x_coords = {} + + for point in largest_contour: + x, y = point[0] + global_x = int(x) + chart_left + global_y = int(y) + chart_top + + if global_x not in x_coords: + x_coords[global_x] = [] + x_coords[global_x].append(global_y) + + # 对每个 x,计算平均 y 值,并转换为频率和 dB 值 + for x in sorted(x_coords.keys()): + y_values = x_coords[x] + avg_y = sum(y_values) // len(y_values) + + # 计算在图表中的相对位置 + relative_x = x - chart_left + relative_y = avg_y - chart_top + + # 转换为频率(对数刻度) + # log10(f) = log10(f_min) + (relative_x / chart_width) * (log10(f_max) - log10(f_min)) + log_freq = np.log10(freq_min) + (relative_x / chart_width) * (np.log10(freq_max) - np.log10(freq_min)) + frequency_hz = 10 ** log_freq + + # 转换为 dB 值(线性刻度,注意 y 轴是反向的) + db_value = db_max - (relative_y / chart_height) * (db_max - db_min) + + frequency_data.append({ + "pixel_x": int(x), + "pixel_y": int(avg_y), + "frequency_hz": round(frequency_hz, 2), + "db_value": round(db_value, 2) + }) + + print(f"\n提取的频响曲线点数:{len(frequency_data)}") + + # 创建可视化结果 + result = img_copy.copy() + for point in frequency_data: + cv2.circle(result, (point["pixel_x"], point["pixel_y"]), 1, (255, 0, 0), -1) + + plt.figure(figsize=(20, 10)) + plt.imshow(result) + plt.title(f'Extracted Frequency Response ({len(frequency_data)} points)') + plt.axis('off') + plt.tight_layout() + plt.show() + + # 保存详细数据到 JSON + output_data = { + "metadata": { + "image_size": {"width": width, "height": height}, + "chart_area": { + "top": chart_top, + "bottom": chart_bottom, + "left": chart_left, + "right": chart_right + }, + "frequency_range": {"min": freq_min, "max": freq_max}, + "db_range": {"min": db_min, "max": db_max} + }, + "data_points": frequency_data + } + + with open('frequency_response_detailed.json', 'w', encoding='utf-8') as f: + json.dump(output_data, f, ensure_ascii=False, indent=2) + + print(f"\n详细数据已保存到 frequency_response_detailed.json") + + # 显示前 50 个点 + print(f"\n前 50 个频响点位(像素坐标 -> 实际值):") + print(f"{'序号':<6} {'X':<8} {'Y':<8} {'频率 (Hz)':<12} {'dB 值':<8}") + print("-" * 50) + for i, point in enumerate(frequency_data[:50]): + print(f"{i+1:<6} {point['pixel_x']:<8} {point['pixel_y']:<8} {point['frequency_hz']:<12.2f} {point['db_value']:<8.2f}") + + # 保存为 CSV 格式 + with open('frequency_response.csv', 'w', encoding='utf-8') as f: + f.write("index,pixel_x,pixel_y,frequency_hz,db_value\n") + for i, point in enumerate(frequency_data): + f.write(f"{i+1},{point['pixel_x']},{point['pixel_y']},{point['frequency_hz']},{point['db_value']}\n") + + print(f"\nCSV 数据已保存到 frequency_response.csv") + + # 绘制频率响应曲线图 + frequencies = [p["frequency_hz"] for p in frequency_data] + db_values = [p["db_value"] for p in frequency_data] + + plt.figure(figsize=(15, 8)) + plt.semilogx(frequencies, db_values, linewidth=1) + plt.grid(True, which='both', linestyle='-', alpha=0.7) + plt.xlabel('Frequency (Hz)') + plt.ylabel('Amplitude (dB)') + plt.title('Extracted Frequency Response Curve') + plt.xlim(20, 20000) + plt.ylim(70, 120) + plt.tight_layout() + plt.savefig('frequency_response_curve.png', dpi=150) + plt.show() + + print(f"\n频响曲线图已保存到 frequency_response_curve.png") +else: + print("未找到频响曲线") diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..119de93 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,41 @@ +version: '3.8' + +services: + backend: + build: + context: ./backend + dockerfile: Dockerfile + container_name: audio-dashboard-backend + environment: + - DATABASE_HOST=${DATABASE_HOST:-localhost} + - DATABASE_PORT=${DATABASE_PORT:-3306} + - DATABASE_NAME=${DATABASE_NAME:-audio} + - DATABASE_USER=${DATABASE_USER:-root} + - DATABASE_PASSWORD=${DATABASE_PASSWORD:-root123} + - APP_NAME=${APP_NAME:-Audio Dashboard API} + - DEBUG=${DEBUG:-True} + - MEILISEARCH_URL=${MEILISEARCH_URL:-http://ec2-18-184-205-87.eu-central-1.compute.amazonaws.com:7700} + - MEILISEARCH_API_KEY=${MEILISEARCH_API_KEY:-young9#!UJsD219921031} + - MEILISEARCH_INDEX=${MEILISEARCH_INDEX:-models} + ports: + - "8083:8000" + restart: unless-stopped + networks: + - audio-network + + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + container_name: audio-dashboard-frontend + ports: + - "8082:80" + depends_on: + - backend + restart: unless-stopped + networks: + - audio-network + +networks: + audio-network: + driver: bridge diff --git a/extract_frequency_response.py b/extract_frequency_response.py new file mode 100644 index 0000000..829a6d1 --- /dev/null +++ b/extract_frequency_response.py @@ -0,0 +1,120 @@ +import cv2 +import numpy as np +import matplotlib.pyplot as plt +import json + +# 读取图片 +img_path = r"C:\Users\yangy\.cursor\projects\h-soft-projects-luxsin-dashboard/assets/c__Users_yangy_AppData_Roaming_Cursor_User_workspaceStorage_b134a9df77916b35c1e5b1ece8dc14fe_images_Arcona-avg-0b78da44-4aaa-465b-9b2b-fba051a28742.png" +img = cv2.imread(img_path) +img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) +img_copy = img.copy() +gray = cv2.cvtColor(img_copy, cv2.COLOR_RGB2GRAY) + +print(f"图片尺寸:{img_copy.shape}") +height, width = gray.shape + +# 定义图表区域(排除顶部标题和底部图例) +# 根据图片估算:顶部约 5%,底部约 8% +chart_top = int(height * 0.05) +chart_bottom = int(height * 0.92) +chart_left = int(width * 0.02) +chart_right = int(width * 0.98) + +# 裁剪出图表区域 +chart_roi = gray[chart_top:chart_bottom, chart_left:chart_right] + +# 使用阈值提取白色线条 +_, thresh = cv2.threshold(chart_roi, 200, 255, cv2.THRESH_BINARY) + +# 形态学操作,连接断开的线条 +kernel = np.ones((3,3), np.uint8) +dilated_thresh = cv2.dilate(thresh, kernel, iterations=2) +eroded_thresh = cv2.erode(dilated_thresh, kernel, iterations=1) + +# 查找轮廓 +contours, _ = cv2.findContours(eroded_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + +# 找到最大的连续轮廓(应该是频响曲线) +largest_contour = None +max_area = 0 + +for contour in contours: + area = cv2.contourArea(contour) + if area > max_area: + max_area = area + largest_contour = contour + +print(f"最大轮廓面积:{max_area}") + +# 提取频响曲线上的点 +frequency_points = [] + +if largest_contour is not None: + # 对于每个 x 坐标,找到对应的 y 坐标(取平均值) + x_coords = {} + + for point in largest_contour: + x, y = point[0] + # 转换回原图坐标 + global_x = int(x) + chart_left + global_y = int(y) + chart_top + + if global_x not in x_coords: + x_coords[global_x] = [] + x_coords[global_x].append(global_y) + + # 对每个 x,计算平均 y 值 + for x in sorted(x_coords.keys()): + y_values = x_coords[x] + avg_y = sum(y_values) // len(y_values) + frequency_points.append([int(x), int(avg_y)]) + + print(f"提取的频响曲线点数:{len(frequency_points)}") + + # 创建可视化结果 + result = img_copy.copy() + + # 绘制检测到的点 + for i, (x, y) in enumerate(frequency_points): + cv2.circle(result, (x, y), 1, (255, 0, 0), -1) + + # 显示结果 + plt.figure(figsize=(20, 10)) + plt.imshow(result) + plt.title(f'Extracted Frequency Response Curve ({len(frequency_points)} points)') + plt.axis('off') + plt.tight_layout() + plt.show() + + # 保存点到 JSON 文件 + output_data = { + "frequency_points": frequency_points, + "chart_area": { + "top": int(chart_top), + "bottom": int(chart_bottom), + "left": int(chart_left), + "right": int(chart_right) + }, + "image_size": { + "width": int(width), + "height": int(height) + } + } + + with open('frequency_response_points.json', 'w', encoding='utf-8') as f: + json.dump(output_data, f, ensure_ascii=False, indent=2) + + print(f"\n频响点位已保存到 frequency_response_points.json") + print(f"\n前 50 个点的坐标 (x, y):") + for i, point in enumerate(frequency_points[:50]): + print(f"{i+1}: {point}") + + # 也保存为 CSV 格式,方便查看 + with open('frequency_response_points.csv', 'w', encoding='utf-8') as f: + f.write("index,x,y\n") + for i, point in enumerate(frequency_points): + f.write(f"{i+1},{point[0]},{point[1]}\n") + + print(f"\n点位也已保存到 frequency_response_points.csv") +else: + print("未找到频响曲线") diff --git a/frequency_response.csv b/frequency_response.csv new file mode 100644 index 0000000..f358881 --- /dev/null +++ b/frequency_response.csv @@ -0,0 +1,535 @@ +index,pixel_x,pixel_y,frequency_hz,db_value +1,278,236,122.58,99.03 +2,284,237,127.86,98.93 +3,285,236,128.76,99.03 +4,286,236,129.67,99.03 +5,287,238,130.58,98.83 +6,288,239,131.5,98.73 +7,289,236,132.43,99.03 +8,290,237,133.36,98.93 +9,295,237,138.13,98.93 +10,296,237,139.11,98.93 +11,297,238,140.09,98.83 +12,323,238,168.17,98.83 +13,324,237,169.36,98.93 +14,325,237,170.55,98.93 +15,334,238,181.69,98.83 +16,335,239,182.97,98.73 +17,339,240,188.18,98.63 +18,340,239,189.51,98.73 +19,341,239,190.85,98.73 +20,342,241,192.19,98.53 +21,343,242,193.55,98.43 +22,344,240,194.91,98.63 +23,345,241,196.29,98.53 +24,346,240,197.67,98.63 +25,347,241,199.07,98.53 +26,348,243,200.47,98.33 +27,349,242,201.88,98.43 +28,350,242,203.31,98.43 +29,352,244,206.18,98.23 +30,353,243,207.64,98.33 +31,354,243,209.1,98.33 +32,358,245,215.06,98.12 +33,359,244,216.58,98.23 +34,360,244,218.11,98.23 +35,361,246,219.65,98.02 +36,362,245,221.19,98.12 +37,363,245,222.75,98.12 +38,364,247,224.32,97.92 +39,365,248,225.91,97.82 +40,366,245,227.5,98.12 +41,367,247,229.1,97.92 +42,368,247,230.72,97.92 +43,369,248,232.35,97.82 +44,370,250,233.99,97.62 +45,371,248,235.64,97.82 +46,372,249,237.3,97.72 +47,373,249,238.97,97.72 +48,374,250,240.66,97.62 +49,375,250,242.35,97.62 +50,376,251,244.06,97.52 +51,377,251,245.78,97.52 +52,378,252,247.52,97.42 +53,379,252,249.26,97.42 +54,380,253,251.02,97.32 +55,381,253,252.79,97.32 +56,382,253,254.57,97.32 +57,383,255,256.37,97.12 +58,384,257,258.18,96.92 +59,385,255,260.0,97.12 +60,386,257,261.83,96.92 +61,387,259,263.68,96.71 +62,388,257,265.54,96.92 +63,389,257,267.41,96.92 +64,390,262,269.29,96.41 +65,391,262,271.19,96.41 +66,392,260,273.11,96.61 +67,393,260,275.03,96.61 +68,397,268,282.87,95.81 +69,398,266,284.87,96.01 +70,399,265,286.88,96.11 +71,408,278,305.6,94.8 +72,409,276,307.76,95.0 +73,410,275,309.93,95.1 +74,413,282,316.53,94.4 +75,414,282,318.77,94.4 +76,415,280,321.01,94.6 +77,416,282,323.28,94.4 +78,417,284,325.56,94.19 +79,418,283,327.85,94.29 +80,419,283,330.16,94.29 +81,420,284,332.49,94.19 +82,421,284,334.84,94.19 +83,422,285,337.2,94.09 +84,423,284,339.58,94.19 +85,424,285,341.97,94.09 +86,426,287,346.81,93.89 +87,427,288,349.26,93.79 +88,429,288,354.2,93.79 +89,430,287,356.7,93.89 +90,433,285,364.3,94.09 +91,434,284,366.87,94.19 +92,435,285,369.45,94.09 +93,436,284,372.06,94.19 +94,437,286,374.68,93.99 +95,438,284,377.33,94.19 +96,439,283,379.99,94.29 +97,440,283,382.67,94.29 +98,441,281,385.37,94.5 +99,442,282,388.08,94.4 +100,443,280,390.82,94.6 +101,444,281,393.58,94.5 +102,446,280,399.15,94.6 +103,447,278,401.96,94.8 +104,448,278,404.8,94.8 +105,449,278,407.65,94.8 +106,450,277,410.52,94.9 +107,451,279,413.42,94.7 +108,452,277,416.34,94.9 +109,453,276,419.27,95.0 +110,454,277,422.23,94.9 +111,455,275,425.21,95.1 +112,456,275,428.2,95.1 +113,457,275,431.22,95.1 +114,458,273,434.26,95.3 +115,459,276,437.33,95.0 +116,460,274,440.41,95.2 +117,461,272,443.52,95.4 +118,462,273,446.64,95.3 +119,463,272,449.79,95.4 +120,464,274,452.97,95.2 +121,465,272,456.16,95.4 +122,466,273,459.38,95.3 +123,467,270,462.62,95.6 +124,468,270,465.88,95.6 +125,469,269,469.16,95.71 +126,470,269,472.47,95.71 +127,471,268,475.8,95.81 +128,472,268,479.16,95.81 +129,473,267,482.54,95.91 +130,474,267,485.94,95.91 +131,475,268,489.37,95.81 +132,476,266,492.82,96.01 +133,477,264,496.3,96.21 +134,478,264,499.8,96.21 +135,479,264,503.32,96.21 +136,480,263,506.87,96.31 +137,481,263,510.44,96.31 +138,482,262,514.04,96.41 +139,483,262,517.67,96.41 +140,484,260,521.32,96.61 +141,485,261,524.99,96.51 +142,486,260,528.7,96.61 +143,487,260,532.43,96.61 +144,488,258,536.18,96.81 +145,489,259,539.96,96.71 +146,490,258,543.77,96.81 +147,491,260,547.6,96.61 +148,492,258,551.47,96.81 +149,493,256,555.35,97.02 +150,494,259,559.27,96.71 +151,495,257,563.21,96.92 +152,496,256,567.19,97.02 +153,497,257,571.19,96.92 +154,499,255,579.27,97.12 +155,500,255,583.36,97.12 +156,501,256,587.47,97.02 +157,502,254,591.61,97.22 +158,503,254,595.78,97.22 +159,504,255,599.99,97.12 +160,506,253,608.48,97.32 +161,507,253,612.77,97.32 +162,508,254,617.09,97.22 +163,513,253,639.16,97.32 +164,514,252,643.66,97.42 +165,519,252,666.68,97.42 +166,520,251,671.38,97.52 +167,537,251,756.58,97.52 +168,538,252,761.91,97.42 +169,541,253,778.14,97.32 +170,542,254,783.63,97.22 +171,543,251,789.16,97.52 +172,544,252,794.72,97.42 +173,545,254,800.33,97.22 +174,546,255,805.97,97.12 +175,547,252,811.66,97.42 +176,548,254,817.38,97.22 +177,549,256,823.14,97.02 +178,550,254,828.95,97.22 +179,551,255,834.79,97.12 +180,552,254,840.68,97.22 +181,553,256,846.61,97.02 +182,555,257,858.59,96.92 +183,556,259,864.65,96.71 +184,557,258,870.74,96.81 +185,558,258,876.88,96.81 +186,559,259,883.07,96.71 +187,560,259,889.3,96.71 +188,561,259,895.57,96.71 +189,562,261,901.88,96.51 +190,563,263,908.24,96.31 +191,564,262,914.65,96.41 +192,565,262,921.1,96.41 +193,566,263,927.59,96.31 +194,567,263,934.13,96.31 +195,568,266,940.72,96.01 +196,569,265,947.36,96.11 +197,570,267,954.04,95.91 +198,571,265,960.76,96.11 +199,572,266,967.54,96.01 +200,573,265,974.36,96.11 +201,574,267,981.23,95.91 +202,575,267,988.15,95.91 +203,576,268,995.12,95.81 +204,577,270,1002.14,95.6 +205,578,267,1009.21,95.91 +206,579,268,1016.32,95.81 +207,580,270,1023.49,95.6 +208,581,269,1030.71,95.71 +209,582,269,1037.98,95.71 +210,583,271,1045.3,95.5 +211,584,272,1052.67,95.4 +212,585,269,1060.09,95.71 +213,586,271,1067.57,95.5 +214,587,271,1075.1,95.5 +215,588,272,1082.68,95.4 +216,589,274,1090.31,95.2 +217,590,271,1098.0,95.5 +218,591,272,1105.74,95.4 +219,595,272,1137.27,95.4 +220,596,271,1145.29,95.5 +221,597,272,1153.36,95.4 +222,598,271,1161.5,95.5 +223,599,271,1169.69,95.5 +224,600,270,1177.94,95.6 +225,601,270,1186.24,95.6 +226,602,269,1194.61,95.71 +227,603,269,1203.03,95.71 +228,604,268,1211.52,95.81 +229,605,270,1220.06,95.6 +230,606,268,1228.66,95.81 +231,607,266,1237.33,96.01 +232,608,269,1246.05,95.71 +233,609,268,1254.84,95.81 +234,610,266,1263.69,96.01 +235,611,266,1272.6,96.01 +236,612,267,1281.58,95.91 +237,613,265,1290.61,96.11 +238,614,265,1299.71,96.11 +239,615,266,1308.88,96.01 +240,617,264,1327.41,96.21 +241,618,264,1336.77,96.21 +242,619,265,1346.19,96.11 +243,628,263,1434.08,96.31 +244,629,262,1444.2,96.41 +245,630,265,1454.38,96.11 +246,631,264,1464.64,96.21 +247,632,262,1474.97,96.41 +248,633,261,1485.37,96.51 +249,634,264,1495.84,96.21 +250,635,262,1506.39,96.41 +251,636,260,1517.01,96.61 +252,637,261,1527.71,96.51 +253,638,260,1538.48,96.61 +254,639,262,1549.33,96.41 +255,640,260,1560.26,96.61 +256,641,258,1571.26,96.81 +257,642,259,1582.34,96.71 +258,643,258,1593.5,96.81 +259,644,260,1604.74,96.61 +260,645,258,1616.06,96.81 +261,646,256,1627.45,97.02 +262,647,257,1638.93,96.92 +263,648,256,1650.49,97.02 +264,649,258,1662.13,96.81 +265,650,256,1673.85,97.02 +266,651,254,1685.65,97.22 +267,652,255,1697.54,97.12 +268,653,254,1709.51,97.22 +269,654,254,1721.56,97.22 +270,655,253,1733.7,97.32 +271,656,253,1745.93,97.32 +272,657,252,1758.24,97.42 +273,658,252,1770.64,97.42 +274,659,251,1783.13,97.52 +275,660,251,1795.7,97.52 +276,661,250,1808.37,97.62 +277,662,250,1821.12,97.62 +278,663,249,1833.96,97.72 +279,664,249,1846.89,97.72 +280,665,248,1859.92,97.82 +281,666,248,1873.03,97.82 +282,667,247,1886.24,97.92 +283,668,249,1899.54,97.72 +284,669,248,1912.94,97.82 +285,674,246,1981.35,98.02 +286,676,248,2009.39,97.82 +287,677,242,2023.56,98.43 +288,679,242,2052.2,98.43 +289,681,239,2081.25,98.73 +290,683,236,2110.71,99.03 +291,685,233,2140.58,99.33 +292,687,232,2170.88,99.44 +293,688,226,2186.19,100.04 +294,690,228,2217.13,99.84 +295,692,221,2248.51,100.54 +296,694,223,2280.33,100.34 +297,696,216,2312.61,101.05 +298,698,218,2345.34,100.85 +299,699,213,2361.88,101.35 +300,700,213,2378.54,101.35 +301,701,213,2395.31,101.35 +302,702,213,2412.2,101.35 +303,703,214,2429.21,101.25 +304,704,214,2446.34,101.25 +305,705,213,2463.59,101.35 +306,706,213,2480.97,101.35 +307,708,210,2516.08,101.65 +308,711,207,2569.69,101.96 +309,712,207,2587.81,101.96 +310,717,200,2680.35,102.66 +311,718,197,2699.25,102.96 +312,719,199,2718.29,102.76 +313,720,197,2737.46,102.96 +314,721,195,2756.76,103.17 +315,722,195,2776.2,103.17 +316,726,197,2855.35,102.96 +317,727,194,2875.48,103.27 +318,728,195,2895.76,103.17 +319,729,195,2916.18,103.17 +320,730,201,2936.74,102.56 +321,731,198,2957.45,102.86 +322,733,198,2999.31,102.86 +323,734,198,3020.46,102.86 +324,736,196,3063.22,103.06 +325,738,195,3106.57,103.17 +326,740,188,3150.54,103.87 +327,741,188,3172.76,103.87 +328,743,186,3217.66,104.07 +329,744,186,3240.35,104.07 +330,745,185,3263.21,104.17 +331,746,187,3286.22,103.97 +332,748,187,3332.73,103.97 +333,749,188,3356.23,103.87 +334,750,186,3379.9,104.07 +335,751,186,3403.73,104.07 +336,752,186,3427.74,104.07 +337,760,198,3625.96,102.86 +338,763,197,3703.21,102.96 +339,774,213,4000.82,101.35 +340,776,214,4057.45,101.25 +341,777,218,4086.06,100.85 +342,778,214,4114.87,101.25 +343,779,219,4143.89,100.75 +344,780,223,4173.11,100.34 +345,781,220,4202.54,100.65 +346,782,222,4232.18,100.44 +347,783,222,4262.02,100.44 +348,784,225,4292.08,100.14 +349,785,224,4322.35,100.24 +350,787,223,4383.52,100.34 +351,789,227,4445.57,99.94 +352,790,226,4476.92,100.04 +353,791,227,4508.49,99.94 +354,792,227,4540.28,99.94 +355,793,232,4572.3,99.44 +356,794,232,4604.54,99.44 +357,795,231,4637.02,99.54 +358,796,230,4669.72,99.64 +359,797,231,4702.65,99.54 +360,799,231,4769.21,99.54 +361,800,230,4802.84,99.64 +362,801,233,4836.71,99.33 +363,802,232,4870.82,99.44 +364,805,232,4974.59,99.44 +365,806,233,5009.67,99.33 +366,808,230,5080.58,99.64 +367,810,227,5152.49,99.94 +368,811,226,5188.82,100.04 +369,812,220,5225.41,100.65 +370,813,212,5262.26,101.45 +371,814,204,5299.37,102.26 +372,815,197,5336.74,102.96 +373,816,192,5374.38,103.47 +374,817,191,5412.28,103.57 +375,818,186,5450.44,104.07 +376,820,186,5527.59,104.07 +377,821,190,5566.57,103.67 +378,822,189,5605.82,103.77 +379,823,192,5645.35,103.47 +380,824,195,5685.17,103.17 +381,825,198,5725.26,102.86 +382,826,201,5765.63,102.56 +383,827,205,5806.29,102.16 +384,828,208,5847.24,101.85 +385,829,212,5888.47,101.45 +386,830,215,5930.0,101.15 +387,831,218,5971.81,100.85 +388,832,222,6013.93,100.44 +389,833,225,6056.34,100.14 +390,834,229,6099.05,99.74 +391,835,231,6142.06,99.54 +392,836,234,6185.37,99.23 +393,837,237,6228.99,98.93 +394,838,239,6272.92,98.73 +395,839,241,6317.15,98.53 +396,840,243,6361.7,98.33 +397,841,245,6406.56,98.12 +398,842,244,6451.74,98.23 +399,843,249,6497.24,97.72 +400,845,249,6589.2,97.72 +401,850,259,6824.83,96.71 +402,851,259,6872.96,96.71 +403,852,258,6921.43,96.81 +404,853,258,6970.24,96.81 +405,854,259,7019.39,96.71 +406,856,258,7118.74,96.81 +407,857,261,7168.94,96.51 +408,859,254,7270.41,97.22 +409,861,256,7373.31,97.02 +410,864,248,7530.41,97.82 +411,865,249,7583.51,97.72 +412,866,244,7636.99,98.23 +413,867,245,7690.84,98.12 +414,868,243,7745.08,98.33 +415,869,241,7799.7,98.53 +416,870,238,7854.7,98.83 +417,871,233,7910.09,99.33 +418,872,228,7965.87,99.84 +419,873,222,8022.05,100.44 +420,874,213,8078.62,101.35 +421,875,224,8135.59,100.24 +422,877,217,8250.74,100.95 +423,878,221,8308.92,100.54 +424,879,225,8367.52,100.14 +425,880,230,8426.52,99.64 +426,881,233,8485.95,99.33 +427,882,236,8545.79,99.03 +428,883,239,8606.06,98.73 +429,884,241,8666.75,98.53 +430,885,244,8727.86,98.23 +431,886,247,8789.41,97.92 +432,887,250,8851.39,97.62 +433,888,254,8913.81,97.22 +434,889,259,8976.67,96.71 +435,890,264,9039.98,96.21 +436,891,269,9103.73,95.71 +437,892,273,9167.93,95.3 +438,893,277,9232.58,94.9 +439,894,282,9297.69,94.4 +440,895,286,9363.25,93.99 +441,896,292,9429.28,93.39 +442,897,298,9495.78,92.78 +443,898,304,9562.74,92.18 +444,899,310,9630.18,91.57 +445,901,302,9766.48,92.38 +446,902,313,9835.35,91.27 +447,903,304,9904.71,92.18 +448,904,306,9974.56,91.98 +449,906,302,10115.73,92.38 +450,907,304,10187.07,92.18 +451,908,309,10258.91,91.67 +452,909,313,10331.26,91.27 +453,910,318,10404.11,90.77 +454,911,319,10477.48,90.67 +455,912,319,10551.37,90.67 +456,914,322,10700.71,90.36 +457,915,317,10776.17,90.87 +458,916,317,10852.16,90.87 +459,917,313,10928.69,91.27 +460,918,309,11005.76,91.67 +461,919,304,11083.37,92.18 +462,920,299,11161.53,92.68 +463,921,294,11240.24,93.19 +464,922,288,11319.51,93.79 +465,923,282,11399.33,94.4 +466,924,276,11479.72,95.0 +467,925,269,11560.68,95.71 +468,926,262,11642.2,96.41 +469,927,256,11724.3,97.02 +470,928,253,11806.98,97.32 +471,929,253,11890.24,97.32 +472,934,248,12315.45,97.82 +473,935,248,12402.29,97.82 +474,936,248,12489.75,97.82 +475,937,245,12577.83,98.12 +476,938,242,12666.53,98.43 +477,939,239,12755.85,98.73 +478,940,236,12845.81,99.03 +479,941,233,12936.4,99.33 +480,942,230,13027.62,99.64 +481,943,229,13119.49,99.74 +482,945,233,13305.18,99.33 +483,946,232,13399.01,99.44 +484,947,238,13493.5,98.83 +485,948,249,13588.66,97.72 +486,949,262,13684.48,96.41 +487,950,278,13780.98,94.8 +488,951,296,13878.17,92.98 +489,952,314,13976.04,91.17 +490,953,324,14074.59,90.16 +491,954,309,14173.85,91.67 +492,955,343,14273.8,88.25 +493,956,329,14374.46,89.66 +494,957,315,14475.83,91.07 +495,958,304,14577.91,92.18 +496,959,296,14680.71,92.98 +497,960,298,14784.24,92.78 +498,962,293,14993.49,93.29 +499,963,290,15099.23,93.59 +500,964,297,15205.71,92.88 +501,965,299,15312.94,92.68 +502,966,302,15420.92,92.38 +503,967,305,15529.67,92.08 +504,968,309,15639.19,91.67 +505,969,315,15749.47,91.07 +506,970,322,15860.54,90.36 +507,971,330,15972.39,89.56 +508,972,339,16085.02,88.65 +509,973,344,16198.45,88.15 +510,974,352,16312.68,87.34 +511,975,345,16427.72,88.04 +512,976,352,16543.57,87.34 +513,977,350,16660.23,87.54 +514,978,349,16777.72,87.64 +515,981,345,17135.18,88.04 +516,982,345,17256.01,88.04 +517,983,343,17377.7,88.25 +518,984,338,17500.25,88.75 +519,985,333,17623.66,89.25 +520,986,327,17747.94,89.86 +521,987,322,17873.1,90.36 +522,988,317,17999.14,90.87 +523,990,324,18253.89,90.16 +524,991,314,18382.62,91.17 +525,992,323,18512.25,90.26 +526,993,329,18642.8,89.66 +527,994,337,18774.27,88.85 +528,995,345,18906.67,88.04 +529,996,352,19039.99,87.34 +530,998,342,19309.48,88.35 +531,999,348,19445.65,87.74 +532,1000,343,19582.78,88.25 +533,1001,335,19720.88,89.05 +534,1002,337,19859.95,88.85 diff --git a/frequency_response_curve.png b/frequency_response_curve.png new file mode 100644 index 0000000..2359a91 Binary files /dev/null and b/frequency_response_curve.png differ diff --git a/frequency_response_detailed.json b/frequency_response_detailed.json new file mode 100644 index 0000000..f1ecd09 --- /dev/null +++ b/frequency_response_detailed.json @@ -0,0 +1,3228 @@ +{ + "metadata": { + "image_size": { + "width": 1024, + "height": 570 + }, + "chart_area": { + "top": 28, + "bottom": 524, + "left": 20, + "right": 1003 + }, + "frequency_range": { + "min": 20, + "max": 20000 + }, + "db_range": { + "min": 70, + "max": 120 + } + }, + "data_points": [ + { + "pixel_x": 278, + "pixel_y": 236, + "frequency_hz": 122.58, + "db_value": 99.03 + }, + { + "pixel_x": 284, + "pixel_y": 237, + "frequency_hz": 127.86, + "db_value": 98.93 + }, + { + "pixel_x": 285, + "pixel_y": 236, + "frequency_hz": 128.76, + "db_value": 99.03 + }, + { + "pixel_x": 286, + "pixel_y": 236, + "frequency_hz": 129.67, + "db_value": 99.03 + }, + { + "pixel_x": 287, + "pixel_y": 238, + "frequency_hz": 130.58, + "db_value": 98.83 + }, + { + "pixel_x": 288, + "pixel_y": 239, + "frequency_hz": 131.5, + "db_value": 98.73 + }, + { + "pixel_x": 289, + "pixel_y": 236, + "frequency_hz": 132.43, + "db_value": 99.03 + }, + { + "pixel_x": 290, + "pixel_y": 237, + "frequency_hz": 133.36, + "db_value": 98.93 + }, + { + "pixel_x": 295, + "pixel_y": 237, + "frequency_hz": 138.13, + "db_value": 98.93 + }, + { + "pixel_x": 296, + "pixel_y": 237, + "frequency_hz": 139.11, + "db_value": 98.93 + }, + { + "pixel_x": 297, + "pixel_y": 238, + "frequency_hz": 140.09, + "db_value": 98.83 + }, + { + "pixel_x": 323, + "pixel_y": 238, + "frequency_hz": 168.17, + "db_value": 98.83 + }, + { + "pixel_x": 324, + "pixel_y": 237, + "frequency_hz": 169.36, + "db_value": 98.93 + }, + { + "pixel_x": 325, + "pixel_y": 237, + "frequency_hz": 170.55, + "db_value": 98.93 + }, + { + "pixel_x": 334, + "pixel_y": 238, + "frequency_hz": 181.69, + "db_value": 98.83 + }, + { + "pixel_x": 335, + "pixel_y": 239, + "frequency_hz": 182.97, + "db_value": 98.73 + }, + { + "pixel_x": 339, + "pixel_y": 240, + "frequency_hz": 188.18, + "db_value": 98.63 + }, + { + "pixel_x": 340, + "pixel_y": 239, + "frequency_hz": 189.51, + "db_value": 98.73 + }, + { + "pixel_x": 341, + "pixel_y": 239, + "frequency_hz": 190.85, + "db_value": 98.73 + }, + { + "pixel_x": 342, + "pixel_y": 241, + "frequency_hz": 192.19, + "db_value": 98.53 + }, + { + "pixel_x": 343, + "pixel_y": 242, + "frequency_hz": 193.55, + "db_value": 98.43 + }, + { + "pixel_x": 344, + "pixel_y": 240, + "frequency_hz": 194.91, + "db_value": 98.63 + }, + { + "pixel_x": 345, + "pixel_y": 241, + "frequency_hz": 196.29, + "db_value": 98.53 + }, + { + "pixel_x": 346, + "pixel_y": 240, + "frequency_hz": 197.67, + "db_value": 98.63 + }, + { + "pixel_x": 347, + "pixel_y": 241, + "frequency_hz": 199.07, + "db_value": 98.53 + }, + { + "pixel_x": 348, + "pixel_y": 243, + "frequency_hz": 200.47, + "db_value": 98.33 + }, + { + "pixel_x": 349, + "pixel_y": 242, + "frequency_hz": 201.88, + "db_value": 98.43 + }, + { + "pixel_x": 350, + "pixel_y": 242, + "frequency_hz": 203.31, + "db_value": 98.43 + }, + { + "pixel_x": 352, + "pixel_y": 244, + "frequency_hz": 206.18, + "db_value": 98.23 + }, + { + "pixel_x": 353, + "pixel_y": 243, + "frequency_hz": 207.64, + "db_value": 98.33 + }, + { + "pixel_x": 354, + "pixel_y": 243, + "frequency_hz": 209.1, + "db_value": 98.33 + }, + { + "pixel_x": 358, + "pixel_y": 245, + "frequency_hz": 215.06, + "db_value": 98.12 + }, + { + "pixel_x": 359, + "pixel_y": 244, + "frequency_hz": 216.58, + "db_value": 98.23 + }, + { + "pixel_x": 360, + "pixel_y": 244, + "frequency_hz": 218.11, + "db_value": 98.23 + }, + { + "pixel_x": 361, + "pixel_y": 246, + "frequency_hz": 219.65, + "db_value": 98.02 + }, + { + "pixel_x": 362, + "pixel_y": 245, + "frequency_hz": 221.19, + "db_value": 98.12 + }, + { + "pixel_x": 363, + "pixel_y": 245, + "frequency_hz": 222.75, + "db_value": 98.12 + }, + { + "pixel_x": 364, + "pixel_y": 247, + "frequency_hz": 224.32, + "db_value": 97.92 + }, + { + "pixel_x": 365, + "pixel_y": 248, + "frequency_hz": 225.91, + "db_value": 97.82 + }, + { + "pixel_x": 366, + "pixel_y": 245, + "frequency_hz": 227.5, + "db_value": 98.12 + }, + { + "pixel_x": 367, + "pixel_y": 247, + "frequency_hz": 229.1, + "db_value": 97.92 + }, + { + "pixel_x": 368, + "pixel_y": 247, + "frequency_hz": 230.72, + "db_value": 97.92 + }, + { + "pixel_x": 369, + "pixel_y": 248, + "frequency_hz": 232.35, + "db_value": 97.82 + }, + { + "pixel_x": 370, + "pixel_y": 250, + "frequency_hz": 233.99, + "db_value": 97.62 + }, + { + "pixel_x": 371, + "pixel_y": 248, + "frequency_hz": 235.64, + "db_value": 97.82 + }, + { + "pixel_x": 372, + "pixel_y": 249, + "frequency_hz": 237.3, + "db_value": 97.72 + }, + { + "pixel_x": 373, + "pixel_y": 249, + "frequency_hz": 238.97, + "db_value": 97.72 + }, + { + "pixel_x": 374, + "pixel_y": 250, + "frequency_hz": 240.66, + "db_value": 97.62 + }, + { + "pixel_x": 375, + "pixel_y": 250, + "frequency_hz": 242.35, + "db_value": 97.62 + }, + { + "pixel_x": 376, + "pixel_y": 251, + "frequency_hz": 244.06, + "db_value": 97.52 + }, + { + "pixel_x": 377, + "pixel_y": 251, + "frequency_hz": 245.78, + "db_value": 97.52 + }, + { + "pixel_x": 378, + "pixel_y": 252, + "frequency_hz": 247.52, + "db_value": 97.42 + }, + { + "pixel_x": 379, + "pixel_y": 252, + "frequency_hz": 249.26, + "db_value": 97.42 + }, + { + "pixel_x": 380, + "pixel_y": 253, + "frequency_hz": 251.02, + "db_value": 97.32 + }, + { + "pixel_x": 381, + "pixel_y": 253, + "frequency_hz": 252.79, + "db_value": 97.32 + }, + { + "pixel_x": 382, + "pixel_y": 253, + "frequency_hz": 254.57, + "db_value": 97.32 + }, + { + "pixel_x": 383, + "pixel_y": 255, + "frequency_hz": 256.37, + "db_value": 97.12 + }, + { + "pixel_x": 384, + "pixel_y": 257, + "frequency_hz": 258.18, + "db_value": 96.92 + }, + { + "pixel_x": 385, + "pixel_y": 255, + "frequency_hz": 260.0, + "db_value": 97.12 + }, + { + "pixel_x": 386, + "pixel_y": 257, + "frequency_hz": 261.83, + "db_value": 96.92 + }, + { + "pixel_x": 387, + "pixel_y": 259, + "frequency_hz": 263.68, + "db_value": 96.71 + }, + { + "pixel_x": 388, + "pixel_y": 257, + "frequency_hz": 265.54, + "db_value": 96.92 + }, + { + "pixel_x": 389, + "pixel_y": 257, + "frequency_hz": 267.41, + "db_value": 96.92 + }, + { + "pixel_x": 390, + "pixel_y": 262, + "frequency_hz": 269.29, + "db_value": 96.41 + }, + { + "pixel_x": 391, + "pixel_y": 262, + "frequency_hz": 271.19, + "db_value": 96.41 + }, + { + "pixel_x": 392, + "pixel_y": 260, + "frequency_hz": 273.11, + "db_value": 96.61 + }, + { + "pixel_x": 393, + "pixel_y": 260, + "frequency_hz": 275.03, + "db_value": 96.61 + }, + { + "pixel_x": 397, + "pixel_y": 268, + "frequency_hz": 282.87, + "db_value": 95.81 + }, + { + "pixel_x": 398, + "pixel_y": 266, + "frequency_hz": 284.87, + "db_value": 96.01 + }, + { + "pixel_x": 399, + "pixel_y": 265, + "frequency_hz": 286.88, + "db_value": 96.11 + }, + { + "pixel_x": 408, + "pixel_y": 278, + "frequency_hz": 305.6, + "db_value": 94.8 + }, + { + "pixel_x": 409, + "pixel_y": 276, + "frequency_hz": 307.76, + "db_value": 95.0 + }, + { + "pixel_x": 410, + "pixel_y": 275, + "frequency_hz": 309.93, + "db_value": 95.1 + }, + { + "pixel_x": 413, + "pixel_y": 282, + "frequency_hz": 316.53, + "db_value": 94.4 + }, + { + "pixel_x": 414, + "pixel_y": 282, + "frequency_hz": 318.77, + "db_value": 94.4 + }, + { + "pixel_x": 415, + "pixel_y": 280, + "frequency_hz": 321.01, + "db_value": 94.6 + }, + { + "pixel_x": 416, + "pixel_y": 282, + "frequency_hz": 323.28, + "db_value": 94.4 + }, + { + "pixel_x": 417, + "pixel_y": 284, + "frequency_hz": 325.56, + "db_value": 94.19 + }, + { + "pixel_x": 418, + "pixel_y": 283, + "frequency_hz": 327.85, + "db_value": 94.29 + }, + { + "pixel_x": 419, + "pixel_y": 283, + "frequency_hz": 330.16, + "db_value": 94.29 + }, + { + "pixel_x": 420, + "pixel_y": 284, + "frequency_hz": 332.49, + "db_value": 94.19 + }, + { + "pixel_x": 421, + "pixel_y": 284, + "frequency_hz": 334.84, + "db_value": 94.19 + }, + { + "pixel_x": 422, + "pixel_y": 285, + "frequency_hz": 337.2, + "db_value": 94.09 + }, + { + "pixel_x": 423, + "pixel_y": 284, + "frequency_hz": 339.58, + "db_value": 94.19 + }, + { + "pixel_x": 424, + "pixel_y": 285, + "frequency_hz": 341.97, + "db_value": 94.09 + }, + { + "pixel_x": 426, + "pixel_y": 287, + "frequency_hz": 346.81, + "db_value": 93.89 + }, + { + "pixel_x": 427, + "pixel_y": 288, + "frequency_hz": 349.26, + "db_value": 93.79 + }, + { + "pixel_x": 429, + "pixel_y": 288, + "frequency_hz": 354.2, + "db_value": 93.79 + }, + { + "pixel_x": 430, + "pixel_y": 287, + "frequency_hz": 356.7, + "db_value": 93.89 + }, + { + "pixel_x": 433, + "pixel_y": 285, + "frequency_hz": 364.3, + "db_value": 94.09 + }, + { + "pixel_x": 434, + "pixel_y": 284, + "frequency_hz": 366.87, + "db_value": 94.19 + }, + { + "pixel_x": 435, + "pixel_y": 285, + "frequency_hz": 369.45, + "db_value": 94.09 + }, + { + "pixel_x": 436, + "pixel_y": 284, + "frequency_hz": 372.06, + "db_value": 94.19 + }, + { + "pixel_x": 437, + "pixel_y": 286, + "frequency_hz": 374.68, + "db_value": 93.99 + }, + { + "pixel_x": 438, + "pixel_y": 284, + "frequency_hz": 377.33, + "db_value": 94.19 + }, + { + "pixel_x": 439, + "pixel_y": 283, + "frequency_hz": 379.99, + "db_value": 94.29 + }, + { + "pixel_x": 440, + "pixel_y": 283, + "frequency_hz": 382.67, + "db_value": 94.29 + }, + { + "pixel_x": 441, + "pixel_y": 281, + "frequency_hz": 385.37, + "db_value": 94.5 + }, + { + "pixel_x": 442, + "pixel_y": 282, + "frequency_hz": 388.08, + "db_value": 94.4 + }, + { + "pixel_x": 443, + "pixel_y": 280, + "frequency_hz": 390.82, + "db_value": 94.6 + }, + { + "pixel_x": 444, + "pixel_y": 281, + "frequency_hz": 393.58, + "db_value": 94.5 + }, + { + "pixel_x": 446, + "pixel_y": 280, + "frequency_hz": 399.15, + "db_value": 94.6 + }, + { + "pixel_x": 447, + "pixel_y": 278, + "frequency_hz": 401.96, + "db_value": 94.8 + }, + { + "pixel_x": 448, + "pixel_y": 278, + "frequency_hz": 404.8, + "db_value": 94.8 + }, + { + "pixel_x": 449, + "pixel_y": 278, + "frequency_hz": 407.65, + "db_value": 94.8 + }, + { + "pixel_x": 450, + "pixel_y": 277, + "frequency_hz": 410.52, + "db_value": 94.9 + }, + { + "pixel_x": 451, + "pixel_y": 279, + "frequency_hz": 413.42, + "db_value": 94.7 + }, + { + "pixel_x": 452, + "pixel_y": 277, + "frequency_hz": 416.34, + "db_value": 94.9 + }, + { + "pixel_x": 453, + "pixel_y": 276, + "frequency_hz": 419.27, + "db_value": 95.0 + }, + { + "pixel_x": 454, + "pixel_y": 277, + "frequency_hz": 422.23, + "db_value": 94.9 + }, + { + "pixel_x": 455, + "pixel_y": 275, + "frequency_hz": 425.21, + "db_value": 95.1 + }, + { + "pixel_x": 456, + "pixel_y": 275, + "frequency_hz": 428.2, + "db_value": 95.1 + }, + { + "pixel_x": 457, + "pixel_y": 275, + "frequency_hz": 431.22, + "db_value": 95.1 + }, + { + "pixel_x": 458, + "pixel_y": 273, + "frequency_hz": 434.26, + "db_value": 95.3 + }, + { + "pixel_x": 459, + "pixel_y": 276, + "frequency_hz": 437.33, + "db_value": 95.0 + }, + { + "pixel_x": 460, + "pixel_y": 274, + "frequency_hz": 440.41, + "db_value": 95.2 + }, + { + "pixel_x": 461, + "pixel_y": 272, + "frequency_hz": 443.52, + "db_value": 95.4 + }, + { + "pixel_x": 462, + "pixel_y": 273, + "frequency_hz": 446.64, + "db_value": 95.3 + }, + { + "pixel_x": 463, + "pixel_y": 272, + "frequency_hz": 449.79, + "db_value": 95.4 + }, + { + "pixel_x": 464, + "pixel_y": 274, + "frequency_hz": 452.97, + "db_value": 95.2 + }, + { + "pixel_x": 465, + "pixel_y": 272, + "frequency_hz": 456.16, + "db_value": 95.4 + }, + { + "pixel_x": 466, + "pixel_y": 273, + "frequency_hz": 459.38, + "db_value": 95.3 + }, + { + "pixel_x": 467, + "pixel_y": 270, + "frequency_hz": 462.62, + "db_value": 95.6 + }, + { + "pixel_x": 468, + "pixel_y": 270, + "frequency_hz": 465.88, + "db_value": 95.6 + }, + { + "pixel_x": 469, + "pixel_y": 269, + "frequency_hz": 469.16, + "db_value": 95.71 + }, + { + "pixel_x": 470, + "pixel_y": 269, + "frequency_hz": 472.47, + "db_value": 95.71 + }, + { + "pixel_x": 471, + "pixel_y": 268, + "frequency_hz": 475.8, + "db_value": 95.81 + }, + { + "pixel_x": 472, + "pixel_y": 268, + "frequency_hz": 479.16, + "db_value": 95.81 + }, + { + "pixel_x": 473, + "pixel_y": 267, + "frequency_hz": 482.54, + "db_value": 95.91 + }, + { + "pixel_x": 474, + "pixel_y": 267, + "frequency_hz": 485.94, + "db_value": 95.91 + }, + { + "pixel_x": 475, + "pixel_y": 268, + "frequency_hz": 489.37, + "db_value": 95.81 + }, + { + "pixel_x": 476, + "pixel_y": 266, + "frequency_hz": 492.82, + "db_value": 96.01 + }, + { + "pixel_x": 477, + "pixel_y": 264, + "frequency_hz": 496.3, + "db_value": 96.21 + }, + { + "pixel_x": 478, + "pixel_y": 264, + "frequency_hz": 499.8, + "db_value": 96.21 + }, + { + "pixel_x": 479, + "pixel_y": 264, + "frequency_hz": 503.32, + "db_value": 96.21 + }, + { + "pixel_x": 480, + "pixel_y": 263, + "frequency_hz": 506.87, + "db_value": 96.31 + }, + { + "pixel_x": 481, + "pixel_y": 263, + "frequency_hz": 510.44, + "db_value": 96.31 + }, + { + "pixel_x": 482, + "pixel_y": 262, + "frequency_hz": 514.04, + "db_value": 96.41 + }, + { + "pixel_x": 483, + "pixel_y": 262, + "frequency_hz": 517.67, + "db_value": 96.41 + }, + { + "pixel_x": 484, + "pixel_y": 260, + "frequency_hz": 521.32, + "db_value": 96.61 + }, + { + "pixel_x": 485, + "pixel_y": 261, + "frequency_hz": 524.99, + "db_value": 96.51 + }, + { + "pixel_x": 486, + "pixel_y": 260, + "frequency_hz": 528.7, + "db_value": 96.61 + }, + { + "pixel_x": 487, + "pixel_y": 260, + "frequency_hz": 532.43, + "db_value": 96.61 + }, + { + "pixel_x": 488, + "pixel_y": 258, + "frequency_hz": 536.18, + "db_value": 96.81 + }, + { + "pixel_x": 489, + "pixel_y": 259, + "frequency_hz": 539.96, + "db_value": 96.71 + }, + { + "pixel_x": 490, + "pixel_y": 258, + "frequency_hz": 543.77, + "db_value": 96.81 + }, + { + "pixel_x": 491, + "pixel_y": 260, + "frequency_hz": 547.6, + "db_value": 96.61 + }, + { + "pixel_x": 492, + "pixel_y": 258, + "frequency_hz": 551.47, + "db_value": 96.81 + }, + { + "pixel_x": 493, + "pixel_y": 256, + "frequency_hz": 555.35, + "db_value": 97.02 + }, + { + "pixel_x": 494, + "pixel_y": 259, + "frequency_hz": 559.27, + "db_value": 96.71 + }, + { + "pixel_x": 495, + "pixel_y": 257, + "frequency_hz": 563.21, + "db_value": 96.92 + }, + { + "pixel_x": 496, + "pixel_y": 256, + "frequency_hz": 567.19, + "db_value": 97.02 + }, + { + "pixel_x": 497, + "pixel_y": 257, + "frequency_hz": 571.19, + "db_value": 96.92 + }, + { + "pixel_x": 499, + "pixel_y": 255, + "frequency_hz": 579.27, + "db_value": 97.12 + }, + { + "pixel_x": 500, + "pixel_y": 255, + "frequency_hz": 583.36, + "db_value": 97.12 + }, + { + "pixel_x": 501, + "pixel_y": 256, + "frequency_hz": 587.47, + "db_value": 97.02 + }, + { + "pixel_x": 502, + "pixel_y": 254, + "frequency_hz": 591.61, + "db_value": 97.22 + }, + { + "pixel_x": 503, + "pixel_y": 254, + "frequency_hz": 595.78, + "db_value": 97.22 + }, + { + "pixel_x": 504, + "pixel_y": 255, + "frequency_hz": 599.99, + "db_value": 97.12 + }, + { + "pixel_x": 506, + "pixel_y": 253, + "frequency_hz": 608.48, + "db_value": 97.32 + }, + { + "pixel_x": 507, + "pixel_y": 253, + "frequency_hz": 612.77, + "db_value": 97.32 + }, + { + "pixel_x": 508, + "pixel_y": 254, + "frequency_hz": 617.09, + "db_value": 97.22 + }, + { + "pixel_x": 513, + "pixel_y": 253, + "frequency_hz": 639.16, + "db_value": 97.32 + }, + { + "pixel_x": 514, + "pixel_y": 252, + "frequency_hz": 643.66, + "db_value": 97.42 + }, + { + "pixel_x": 519, + "pixel_y": 252, + "frequency_hz": 666.68, + "db_value": 97.42 + }, + { + "pixel_x": 520, + "pixel_y": 251, + "frequency_hz": 671.38, + "db_value": 97.52 + }, + { + "pixel_x": 537, + "pixel_y": 251, + "frequency_hz": 756.58, + "db_value": 97.52 + }, + { + "pixel_x": 538, + "pixel_y": 252, + "frequency_hz": 761.91, + "db_value": 97.42 + }, + { + "pixel_x": 541, + "pixel_y": 253, + "frequency_hz": 778.14, + "db_value": 97.32 + }, + { + "pixel_x": 542, + "pixel_y": 254, + "frequency_hz": 783.63, + "db_value": 97.22 + }, + { + "pixel_x": 543, + "pixel_y": 251, + "frequency_hz": 789.16, + "db_value": 97.52 + }, + { + "pixel_x": 544, + "pixel_y": 252, + "frequency_hz": 794.72, + "db_value": 97.42 + }, + { + "pixel_x": 545, + "pixel_y": 254, + "frequency_hz": 800.33, + "db_value": 97.22 + }, + { + "pixel_x": 546, + "pixel_y": 255, + "frequency_hz": 805.97, + "db_value": 97.12 + }, + { + "pixel_x": 547, + "pixel_y": 252, + "frequency_hz": 811.66, + "db_value": 97.42 + }, + { + "pixel_x": 548, + "pixel_y": 254, + "frequency_hz": 817.38, + "db_value": 97.22 + }, + { + "pixel_x": 549, + "pixel_y": 256, + "frequency_hz": 823.14, + "db_value": 97.02 + }, + { + "pixel_x": 550, + "pixel_y": 254, + "frequency_hz": 828.95, + "db_value": 97.22 + }, + { + "pixel_x": 551, + "pixel_y": 255, + "frequency_hz": 834.79, + "db_value": 97.12 + }, + { + "pixel_x": 552, + "pixel_y": 254, + "frequency_hz": 840.68, + "db_value": 97.22 + }, + { + "pixel_x": 553, + "pixel_y": 256, + "frequency_hz": 846.61, + "db_value": 97.02 + }, + { + "pixel_x": 555, + "pixel_y": 257, + "frequency_hz": 858.59, + "db_value": 96.92 + }, + { + "pixel_x": 556, + "pixel_y": 259, + "frequency_hz": 864.65, + "db_value": 96.71 + }, + { + "pixel_x": 557, + "pixel_y": 258, + "frequency_hz": 870.74, + "db_value": 96.81 + }, + { + "pixel_x": 558, + "pixel_y": 258, + "frequency_hz": 876.88, + "db_value": 96.81 + }, + { + "pixel_x": 559, + "pixel_y": 259, + "frequency_hz": 883.07, + "db_value": 96.71 + }, + { + "pixel_x": 560, + "pixel_y": 259, + "frequency_hz": 889.3, + "db_value": 96.71 + }, + { + "pixel_x": 561, + "pixel_y": 259, + "frequency_hz": 895.57, + "db_value": 96.71 + }, + { + "pixel_x": 562, + "pixel_y": 261, + "frequency_hz": 901.88, + "db_value": 96.51 + }, + { + "pixel_x": 563, + "pixel_y": 263, + "frequency_hz": 908.24, + "db_value": 96.31 + }, + { + "pixel_x": 564, + "pixel_y": 262, + "frequency_hz": 914.65, + "db_value": 96.41 + }, + { + "pixel_x": 565, + "pixel_y": 262, + "frequency_hz": 921.1, + "db_value": 96.41 + }, + { + "pixel_x": 566, + "pixel_y": 263, + "frequency_hz": 927.59, + "db_value": 96.31 + }, + { + "pixel_x": 567, + "pixel_y": 263, + "frequency_hz": 934.13, + "db_value": 96.31 + }, + { + "pixel_x": 568, + "pixel_y": 266, + "frequency_hz": 940.72, + "db_value": 96.01 + }, + { + "pixel_x": 569, + "pixel_y": 265, + "frequency_hz": 947.36, + "db_value": 96.11 + }, + { + "pixel_x": 570, + "pixel_y": 267, + "frequency_hz": 954.04, + "db_value": 95.91 + }, + { + "pixel_x": 571, + "pixel_y": 265, + "frequency_hz": 960.76, + "db_value": 96.11 + }, + { + "pixel_x": 572, + "pixel_y": 266, + "frequency_hz": 967.54, + "db_value": 96.01 + }, + { + "pixel_x": 573, + "pixel_y": 265, + "frequency_hz": 974.36, + "db_value": 96.11 + }, + { + "pixel_x": 574, + "pixel_y": 267, + "frequency_hz": 981.23, + "db_value": 95.91 + }, + { + "pixel_x": 575, + "pixel_y": 267, + "frequency_hz": 988.15, + "db_value": 95.91 + }, + { + "pixel_x": 576, + "pixel_y": 268, + "frequency_hz": 995.12, + "db_value": 95.81 + }, + { + "pixel_x": 577, + "pixel_y": 270, + "frequency_hz": 1002.14, + "db_value": 95.6 + }, + { + "pixel_x": 578, + "pixel_y": 267, + "frequency_hz": 1009.21, + "db_value": 95.91 + }, + { + "pixel_x": 579, + "pixel_y": 268, + "frequency_hz": 1016.32, + "db_value": 95.81 + }, + { + "pixel_x": 580, + "pixel_y": 270, + "frequency_hz": 1023.49, + "db_value": 95.6 + }, + { + "pixel_x": 581, + "pixel_y": 269, + "frequency_hz": 1030.71, + "db_value": 95.71 + }, + { + "pixel_x": 582, + "pixel_y": 269, + "frequency_hz": 1037.98, + "db_value": 95.71 + }, + { + "pixel_x": 583, + "pixel_y": 271, + "frequency_hz": 1045.3, + "db_value": 95.5 + }, + { + "pixel_x": 584, + "pixel_y": 272, + "frequency_hz": 1052.67, + "db_value": 95.4 + }, + { + "pixel_x": 585, + "pixel_y": 269, + "frequency_hz": 1060.09, + "db_value": 95.71 + }, + { + "pixel_x": 586, + "pixel_y": 271, + "frequency_hz": 1067.57, + "db_value": 95.5 + }, + { + "pixel_x": 587, + "pixel_y": 271, + "frequency_hz": 1075.1, + "db_value": 95.5 + }, + { + "pixel_x": 588, + "pixel_y": 272, + "frequency_hz": 1082.68, + "db_value": 95.4 + }, + { + "pixel_x": 589, + "pixel_y": 274, + "frequency_hz": 1090.31, + "db_value": 95.2 + }, + { + "pixel_x": 590, + "pixel_y": 271, + "frequency_hz": 1098.0, + "db_value": 95.5 + }, + { + "pixel_x": 591, + "pixel_y": 272, + "frequency_hz": 1105.74, + "db_value": 95.4 + }, + { + "pixel_x": 595, + "pixel_y": 272, + "frequency_hz": 1137.27, + "db_value": 95.4 + }, + { + "pixel_x": 596, + "pixel_y": 271, + "frequency_hz": 1145.29, + "db_value": 95.5 + }, + { + "pixel_x": 597, + "pixel_y": 272, + "frequency_hz": 1153.36, + "db_value": 95.4 + }, + { + "pixel_x": 598, + "pixel_y": 271, + "frequency_hz": 1161.5, + "db_value": 95.5 + }, + { + "pixel_x": 599, + "pixel_y": 271, + "frequency_hz": 1169.69, + "db_value": 95.5 + }, + { + "pixel_x": 600, + "pixel_y": 270, + "frequency_hz": 1177.94, + "db_value": 95.6 + }, + { + "pixel_x": 601, + "pixel_y": 270, + "frequency_hz": 1186.24, + "db_value": 95.6 + }, + { + "pixel_x": 602, + "pixel_y": 269, + "frequency_hz": 1194.61, + "db_value": 95.71 + }, + { + "pixel_x": 603, + "pixel_y": 269, + "frequency_hz": 1203.03, + "db_value": 95.71 + }, + { + "pixel_x": 604, + "pixel_y": 268, + "frequency_hz": 1211.52, + "db_value": 95.81 + }, + { + "pixel_x": 605, + "pixel_y": 270, + "frequency_hz": 1220.06, + "db_value": 95.6 + }, + { + "pixel_x": 606, + "pixel_y": 268, + "frequency_hz": 1228.66, + "db_value": 95.81 + }, + { + "pixel_x": 607, + "pixel_y": 266, + "frequency_hz": 1237.33, + "db_value": 96.01 + }, + { + "pixel_x": 608, + "pixel_y": 269, + "frequency_hz": 1246.05, + "db_value": 95.71 + }, + { + "pixel_x": 609, + "pixel_y": 268, + "frequency_hz": 1254.84, + "db_value": 95.81 + }, + { + "pixel_x": 610, + "pixel_y": 266, + "frequency_hz": 1263.69, + "db_value": 96.01 + }, + { + "pixel_x": 611, + "pixel_y": 266, + "frequency_hz": 1272.6, + "db_value": 96.01 + }, + { + "pixel_x": 612, + "pixel_y": 267, + "frequency_hz": 1281.58, + "db_value": 95.91 + }, + { + "pixel_x": 613, + "pixel_y": 265, + "frequency_hz": 1290.61, + "db_value": 96.11 + }, + { + "pixel_x": 614, + "pixel_y": 265, + "frequency_hz": 1299.71, + "db_value": 96.11 + }, + { + "pixel_x": 615, + "pixel_y": 266, + "frequency_hz": 1308.88, + "db_value": 96.01 + }, + { + "pixel_x": 617, + "pixel_y": 264, + "frequency_hz": 1327.41, + "db_value": 96.21 + }, + { + "pixel_x": 618, + "pixel_y": 264, + "frequency_hz": 1336.77, + "db_value": 96.21 + }, + { + "pixel_x": 619, + "pixel_y": 265, + "frequency_hz": 1346.19, + "db_value": 96.11 + }, + { + "pixel_x": 628, + "pixel_y": 263, + "frequency_hz": 1434.08, + "db_value": 96.31 + }, + { + "pixel_x": 629, + "pixel_y": 262, + "frequency_hz": 1444.2, + "db_value": 96.41 + }, + { + "pixel_x": 630, + "pixel_y": 265, + "frequency_hz": 1454.38, + "db_value": 96.11 + }, + { + "pixel_x": 631, + "pixel_y": 264, + "frequency_hz": 1464.64, + "db_value": 96.21 + }, + { + "pixel_x": 632, + "pixel_y": 262, + "frequency_hz": 1474.97, + "db_value": 96.41 + }, + { + "pixel_x": 633, + "pixel_y": 261, + "frequency_hz": 1485.37, + "db_value": 96.51 + }, + { + "pixel_x": 634, + "pixel_y": 264, + "frequency_hz": 1495.84, + "db_value": 96.21 + }, + { + "pixel_x": 635, + "pixel_y": 262, + "frequency_hz": 1506.39, + "db_value": 96.41 + }, + { + "pixel_x": 636, + "pixel_y": 260, + "frequency_hz": 1517.01, + "db_value": 96.61 + }, + { + "pixel_x": 637, + "pixel_y": 261, + "frequency_hz": 1527.71, + "db_value": 96.51 + }, + { + "pixel_x": 638, + "pixel_y": 260, + "frequency_hz": 1538.48, + "db_value": 96.61 + }, + { + "pixel_x": 639, + "pixel_y": 262, + "frequency_hz": 1549.33, + "db_value": 96.41 + }, + { + "pixel_x": 640, + "pixel_y": 260, + "frequency_hz": 1560.26, + "db_value": 96.61 + }, + { + "pixel_x": 641, + "pixel_y": 258, + "frequency_hz": 1571.26, + "db_value": 96.81 + }, + { + "pixel_x": 642, + "pixel_y": 259, + "frequency_hz": 1582.34, + "db_value": 96.71 + }, + { + "pixel_x": 643, + "pixel_y": 258, + "frequency_hz": 1593.5, + "db_value": 96.81 + }, + { + "pixel_x": 644, + "pixel_y": 260, + "frequency_hz": 1604.74, + "db_value": 96.61 + }, + { + "pixel_x": 645, + "pixel_y": 258, + "frequency_hz": 1616.06, + "db_value": 96.81 + }, + { + "pixel_x": 646, + "pixel_y": 256, + "frequency_hz": 1627.45, + "db_value": 97.02 + }, + { + "pixel_x": 647, + "pixel_y": 257, + "frequency_hz": 1638.93, + "db_value": 96.92 + }, + { + "pixel_x": 648, + "pixel_y": 256, + "frequency_hz": 1650.49, + "db_value": 97.02 + }, + { + "pixel_x": 649, + "pixel_y": 258, + "frequency_hz": 1662.13, + "db_value": 96.81 + }, + { + "pixel_x": 650, + "pixel_y": 256, + "frequency_hz": 1673.85, + "db_value": 97.02 + }, + { + "pixel_x": 651, + "pixel_y": 254, + "frequency_hz": 1685.65, + "db_value": 97.22 + }, + { + "pixel_x": 652, + "pixel_y": 255, + "frequency_hz": 1697.54, + "db_value": 97.12 + }, + { + "pixel_x": 653, + "pixel_y": 254, + "frequency_hz": 1709.51, + "db_value": 97.22 + }, + { + "pixel_x": 654, + "pixel_y": 254, + "frequency_hz": 1721.56, + "db_value": 97.22 + }, + { + "pixel_x": 655, + "pixel_y": 253, + "frequency_hz": 1733.7, + "db_value": 97.32 + }, + { + "pixel_x": 656, + "pixel_y": 253, + "frequency_hz": 1745.93, + "db_value": 97.32 + }, + { + "pixel_x": 657, + "pixel_y": 252, + "frequency_hz": 1758.24, + "db_value": 97.42 + }, + { + "pixel_x": 658, + "pixel_y": 252, + "frequency_hz": 1770.64, + "db_value": 97.42 + }, + { + "pixel_x": 659, + "pixel_y": 251, + "frequency_hz": 1783.13, + "db_value": 97.52 + }, + { + "pixel_x": 660, + "pixel_y": 251, + "frequency_hz": 1795.7, + "db_value": 97.52 + }, + { + "pixel_x": 661, + "pixel_y": 250, + "frequency_hz": 1808.37, + "db_value": 97.62 + }, + { + "pixel_x": 662, + "pixel_y": 250, + "frequency_hz": 1821.12, + "db_value": 97.62 + }, + { + "pixel_x": 663, + "pixel_y": 249, + "frequency_hz": 1833.96, + "db_value": 97.72 + }, + { + "pixel_x": 664, + "pixel_y": 249, + "frequency_hz": 1846.89, + "db_value": 97.72 + }, + { + "pixel_x": 665, + "pixel_y": 248, + "frequency_hz": 1859.92, + "db_value": 97.82 + }, + { + "pixel_x": 666, + "pixel_y": 248, + "frequency_hz": 1873.03, + "db_value": 97.82 + }, + { + "pixel_x": 667, + "pixel_y": 247, + "frequency_hz": 1886.24, + "db_value": 97.92 + }, + { + "pixel_x": 668, + "pixel_y": 249, + "frequency_hz": 1899.54, + "db_value": 97.72 + }, + { + "pixel_x": 669, + "pixel_y": 248, + "frequency_hz": 1912.94, + "db_value": 97.82 + }, + { + "pixel_x": 674, + "pixel_y": 246, + "frequency_hz": 1981.35, + "db_value": 98.02 + }, + { + "pixel_x": 676, + "pixel_y": 248, + "frequency_hz": 2009.39, + "db_value": 97.82 + }, + { + "pixel_x": 677, + "pixel_y": 242, + "frequency_hz": 2023.56, + "db_value": 98.43 + }, + { + "pixel_x": 679, + "pixel_y": 242, + "frequency_hz": 2052.2, + "db_value": 98.43 + }, + { + "pixel_x": 681, + "pixel_y": 239, + "frequency_hz": 2081.25, + "db_value": 98.73 + }, + { + "pixel_x": 683, + "pixel_y": 236, + "frequency_hz": 2110.71, + "db_value": 99.03 + }, + { + "pixel_x": 685, + "pixel_y": 233, + "frequency_hz": 2140.58, + "db_value": 99.33 + }, + { + "pixel_x": 687, + "pixel_y": 232, + "frequency_hz": 2170.88, + "db_value": 99.44 + }, + { + "pixel_x": 688, + "pixel_y": 226, + "frequency_hz": 2186.19, + "db_value": 100.04 + }, + { + "pixel_x": 690, + "pixel_y": 228, + "frequency_hz": 2217.13, + "db_value": 99.84 + }, + { + "pixel_x": 692, + "pixel_y": 221, + "frequency_hz": 2248.51, + "db_value": 100.54 + }, + { + "pixel_x": 694, + "pixel_y": 223, + "frequency_hz": 2280.33, + "db_value": 100.34 + }, + { + "pixel_x": 696, + "pixel_y": 216, + "frequency_hz": 2312.61, + "db_value": 101.05 + }, + { + "pixel_x": 698, + "pixel_y": 218, + "frequency_hz": 2345.34, + "db_value": 100.85 + }, + { + "pixel_x": 699, + "pixel_y": 213, + "frequency_hz": 2361.88, + "db_value": 101.35 + }, + { + "pixel_x": 700, + "pixel_y": 213, + "frequency_hz": 2378.54, + "db_value": 101.35 + }, + { + "pixel_x": 701, + "pixel_y": 213, + "frequency_hz": 2395.31, + "db_value": 101.35 + }, + { + "pixel_x": 702, + "pixel_y": 213, + "frequency_hz": 2412.2, + "db_value": 101.35 + }, + { + "pixel_x": 703, + "pixel_y": 214, + "frequency_hz": 2429.21, + "db_value": 101.25 + }, + { + "pixel_x": 704, + "pixel_y": 214, + "frequency_hz": 2446.34, + "db_value": 101.25 + }, + { + "pixel_x": 705, + "pixel_y": 213, + "frequency_hz": 2463.59, + "db_value": 101.35 + }, + { + "pixel_x": 706, + "pixel_y": 213, + "frequency_hz": 2480.97, + "db_value": 101.35 + }, + { + "pixel_x": 708, + "pixel_y": 210, + "frequency_hz": 2516.08, + "db_value": 101.65 + }, + { + "pixel_x": 711, + "pixel_y": 207, + "frequency_hz": 2569.69, + "db_value": 101.96 + }, + { + "pixel_x": 712, + "pixel_y": 207, + "frequency_hz": 2587.81, + "db_value": 101.96 + }, + { + "pixel_x": 717, + "pixel_y": 200, + "frequency_hz": 2680.35, + "db_value": 102.66 + }, + { + "pixel_x": 718, + "pixel_y": 197, + "frequency_hz": 2699.25, + "db_value": 102.96 + }, + { + "pixel_x": 719, + "pixel_y": 199, + "frequency_hz": 2718.29, + "db_value": 102.76 + }, + { + "pixel_x": 720, + "pixel_y": 197, + "frequency_hz": 2737.46, + "db_value": 102.96 + }, + { + "pixel_x": 721, + "pixel_y": 195, + "frequency_hz": 2756.76, + "db_value": 103.17 + }, + { + "pixel_x": 722, + "pixel_y": 195, + "frequency_hz": 2776.2, + "db_value": 103.17 + }, + { + "pixel_x": 726, + "pixel_y": 197, + "frequency_hz": 2855.35, + "db_value": 102.96 + }, + { + "pixel_x": 727, + "pixel_y": 194, + "frequency_hz": 2875.48, + "db_value": 103.27 + }, + { + "pixel_x": 728, + "pixel_y": 195, + "frequency_hz": 2895.76, + "db_value": 103.17 + }, + { + "pixel_x": 729, + "pixel_y": 195, + "frequency_hz": 2916.18, + "db_value": 103.17 + }, + { + "pixel_x": 730, + "pixel_y": 201, + "frequency_hz": 2936.74, + "db_value": 102.56 + }, + { + "pixel_x": 731, + "pixel_y": 198, + "frequency_hz": 2957.45, + "db_value": 102.86 + }, + { + "pixel_x": 733, + "pixel_y": 198, + "frequency_hz": 2999.31, + "db_value": 102.86 + }, + { + "pixel_x": 734, + "pixel_y": 198, + "frequency_hz": 3020.46, + "db_value": 102.86 + }, + { + "pixel_x": 736, + "pixel_y": 196, + "frequency_hz": 3063.22, + "db_value": 103.06 + }, + { + "pixel_x": 738, + "pixel_y": 195, + "frequency_hz": 3106.57, + "db_value": 103.17 + }, + { + "pixel_x": 740, + "pixel_y": 188, + "frequency_hz": 3150.54, + "db_value": 103.87 + }, + { + "pixel_x": 741, + "pixel_y": 188, + "frequency_hz": 3172.76, + "db_value": 103.87 + }, + { + "pixel_x": 743, + "pixel_y": 186, + "frequency_hz": 3217.66, + "db_value": 104.07 + }, + { + "pixel_x": 744, + "pixel_y": 186, + "frequency_hz": 3240.35, + "db_value": 104.07 + }, + { + "pixel_x": 745, + "pixel_y": 185, + "frequency_hz": 3263.21, + "db_value": 104.17 + }, + { + "pixel_x": 746, + "pixel_y": 187, + "frequency_hz": 3286.22, + "db_value": 103.97 + }, + { + "pixel_x": 748, + "pixel_y": 187, + "frequency_hz": 3332.73, + "db_value": 103.97 + }, + { + "pixel_x": 749, + "pixel_y": 188, + "frequency_hz": 3356.23, + "db_value": 103.87 + }, + { + "pixel_x": 750, + "pixel_y": 186, + "frequency_hz": 3379.9, + "db_value": 104.07 + }, + { + "pixel_x": 751, + "pixel_y": 186, + "frequency_hz": 3403.73, + "db_value": 104.07 + }, + { + "pixel_x": 752, + "pixel_y": 186, + "frequency_hz": 3427.74, + "db_value": 104.07 + }, + { + "pixel_x": 760, + "pixel_y": 198, + "frequency_hz": 3625.96, + "db_value": 102.86 + }, + { + "pixel_x": 763, + "pixel_y": 197, + "frequency_hz": 3703.21, + "db_value": 102.96 + }, + { + "pixel_x": 774, + "pixel_y": 213, + "frequency_hz": 4000.82, + "db_value": 101.35 + }, + { + "pixel_x": 776, + "pixel_y": 214, + "frequency_hz": 4057.45, + "db_value": 101.25 + }, + { + "pixel_x": 777, + "pixel_y": 218, + "frequency_hz": 4086.06, + "db_value": 100.85 + }, + { + "pixel_x": 778, + "pixel_y": 214, + "frequency_hz": 4114.87, + "db_value": 101.25 + }, + { + "pixel_x": 779, + "pixel_y": 219, + "frequency_hz": 4143.89, + "db_value": 100.75 + }, + { + "pixel_x": 780, + "pixel_y": 223, + "frequency_hz": 4173.11, + "db_value": 100.34 + }, + { + "pixel_x": 781, + "pixel_y": 220, + "frequency_hz": 4202.54, + "db_value": 100.65 + }, + { + "pixel_x": 782, + "pixel_y": 222, + "frequency_hz": 4232.18, + "db_value": 100.44 + }, + { + "pixel_x": 783, + "pixel_y": 222, + "frequency_hz": 4262.02, + "db_value": 100.44 + }, + { + "pixel_x": 784, + "pixel_y": 225, + "frequency_hz": 4292.08, + "db_value": 100.14 + }, + { + "pixel_x": 785, + "pixel_y": 224, + "frequency_hz": 4322.35, + "db_value": 100.24 + }, + { + "pixel_x": 787, + "pixel_y": 223, + "frequency_hz": 4383.52, + "db_value": 100.34 + }, + { + "pixel_x": 789, + "pixel_y": 227, + "frequency_hz": 4445.57, + "db_value": 99.94 + }, + { + "pixel_x": 790, + "pixel_y": 226, + "frequency_hz": 4476.92, + "db_value": 100.04 + }, + { + "pixel_x": 791, + "pixel_y": 227, + "frequency_hz": 4508.49, + "db_value": 99.94 + }, + { + "pixel_x": 792, + "pixel_y": 227, + "frequency_hz": 4540.28, + "db_value": 99.94 + }, + { + "pixel_x": 793, + "pixel_y": 232, + "frequency_hz": 4572.3, + "db_value": 99.44 + }, + { + "pixel_x": 794, + "pixel_y": 232, + "frequency_hz": 4604.54, + "db_value": 99.44 + }, + { + "pixel_x": 795, + "pixel_y": 231, + "frequency_hz": 4637.02, + "db_value": 99.54 + }, + { + "pixel_x": 796, + "pixel_y": 230, + "frequency_hz": 4669.72, + "db_value": 99.64 + }, + { + "pixel_x": 797, + "pixel_y": 231, + "frequency_hz": 4702.65, + "db_value": 99.54 + }, + { + "pixel_x": 799, + "pixel_y": 231, + "frequency_hz": 4769.21, + "db_value": 99.54 + }, + { + "pixel_x": 800, + "pixel_y": 230, + "frequency_hz": 4802.84, + "db_value": 99.64 + }, + { + "pixel_x": 801, + "pixel_y": 233, + "frequency_hz": 4836.71, + "db_value": 99.33 + }, + { + "pixel_x": 802, + "pixel_y": 232, + "frequency_hz": 4870.82, + "db_value": 99.44 + }, + { + "pixel_x": 805, + "pixel_y": 232, + "frequency_hz": 4974.59, + "db_value": 99.44 + }, + { + "pixel_x": 806, + "pixel_y": 233, + "frequency_hz": 5009.67, + "db_value": 99.33 + }, + { + "pixel_x": 808, + "pixel_y": 230, + "frequency_hz": 5080.58, + "db_value": 99.64 + }, + { + "pixel_x": 810, + "pixel_y": 227, + "frequency_hz": 5152.49, + "db_value": 99.94 + }, + { + "pixel_x": 811, + "pixel_y": 226, + "frequency_hz": 5188.82, + "db_value": 100.04 + }, + { + "pixel_x": 812, + "pixel_y": 220, + "frequency_hz": 5225.41, + "db_value": 100.65 + }, + { + "pixel_x": 813, + "pixel_y": 212, + "frequency_hz": 5262.26, + "db_value": 101.45 + }, + { + "pixel_x": 814, + "pixel_y": 204, + "frequency_hz": 5299.37, + "db_value": 102.26 + }, + { + "pixel_x": 815, + "pixel_y": 197, + "frequency_hz": 5336.74, + "db_value": 102.96 + }, + { + "pixel_x": 816, + "pixel_y": 192, + "frequency_hz": 5374.38, + "db_value": 103.47 + }, + { + "pixel_x": 817, + "pixel_y": 191, + "frequency_hz": 5412.28, + "db_value": 103.57 + }, + { + "pixel_x": 818, + "pixel_y": 186, + "frequency_hz": 5450.44, + "db_value": 104.07 + }, + { + "pixel_x": 820, + "pixel_y": 186, + "frequency_hz": 5527.59, + "db_value": 104.07 + }, + { + "pixel_x": 821, + "pixel_y": 190, + "frequency_hz": 5566.57, + "db_value": 103.67 + }, + { + "pixel_x": 822, + "pixel_y": 189, + "frequency_hz": 5605.82, + "db_value": 103.77 + }, + { + "pixel_x": 823, + "pixel_y": 192, + "frequency_hz": 5645.35, + "db_value": 103.47 + }, + { + "pixel_x": 824, + "pixel_y": 195, + "frequency_hz": 5685.17, + "db_value": 103.17 + }, + { + "pixel_x": 825, + "pixel_y": 198, + "frequency_hz": 5725.26, + "db_value": 102.86 + }, + { + "pixel_x": 826, + "pixel_y": 201, + "frequency_hz": 5765.63, + "db_value": 102.56 + }, + { + "pixel_x": 827, + "pixel_y": 205, + "frequency_hz": 5806.29, + "db_value": 102.16 + }, + { + "pixel_x": 828, + "pixel_y": 208, + "frequency_hz": 5847.24, + "db_value": 101.85 + }, + { + "pixel_x": 829, + "pixel_y": 212, + "frequency_hz": 5888.47, + "db_value": 101.45 + }, + { + "pixel_x": 830, + "pixel_y": 215, + "frequency_hz": 5930.0, + "db_value": 101.15 + }, + { + "pixel_x": 831, + "pixel_y": 218, + "frequency_hz": 5971.81, + "db_value": 100.85 + }, + { + "pixel_x": 832, + "pixel_y": 222, + "frequency_hz": 6013.93, + "db_value": 100.44 + }, + { + "pixel_x": 833, + "pixel_y": 225, + "frequency_hz": 6056.34, + "db_value": 100.14 + }, + { + "pixel_x": 834, + "pixel_y": 229, + "frequency_hz": 6099.05, + "db_value": 99.74 + }, + { + "pixel_x": 835, + "pixel_y": 231, + "frequency_hz": 6142.06, + "db_value": 99.54 + }, + { + "pixel_x": 836, + "pixel_y": 234, + "frequency_hz": 6185.37, + "db_value": 99.23 + }, + { + "pixel_x": 837, + "pixel_y": 237, + "frequency_hz": 6228.99, + "db_value": 98.93 + }, + { + "pixel_x": 838, + "pixel_y": 239, + "frequency_hz": 6272.92, + "db_value": 98.73 + }, + { + "pixel_x": 839, + "pixel_y": 241, + "frequency_hz": 6317.15, + "db_value": 98.53 + }, + { + "pixel_x": 840, + "pixel_y": 243, + "frequency_hz": 6361.7, + "db_value": 98.33 + }, + { + "pixel_x": 841, + "pixel_y": 245, + "frequency_hz": 6406.56, + "db_value": 98.12 + }, + { + "pixel_x": 842, + "pixel_y": 244, + "frequency_hz": 6451.74, + "db_value": 98.23 + }, + { + "pixel_x": 843, + "pixel_y": 249, + "frequency_hz": 6497.24, + "db_value": 97.72 + }, + { + "pixel_x": 845, + "pixel_y": 249, + "frequency_hz": 6589.2, + "db_value": 97.72 + }, + { + "pixel_x": 850, + "pixel_y": 259, + "frequency_hz": 6824.83, + "db_value": 96.71 + }, + { + "pixel_x": 851, + "pixel_y": 259, + "frequency_hz": 6872.96, + "db_value": 96.71 + }, + { + "pixel_x": 852, + "pixel_y": 258, + "frequency_hz": 6921.43, + "db_value": 96.81 + }, + { + "pixel_x": 853, + "pixel_y": 258, + "frequency_hz": 6970.24, + "db_value": 96.81 + }, + { + "pixel_x": 854, + "pixel_y": 259, + "frequency_hz": 7019.39, + "db_value": 96.71 + }, + { + "pixel_x": 856, + "pixel_y": 258, + "frequency_hz": 7118.74, + "db_value": 96.81 + }, + { + "pixel_x": 857, + "pixel_y": 261, + "frequency_hz": 7168.94, + "db_value": 96.51 + }, + { + "pixel_x": 859, + "pixel_y": 254, + "frequency_hz": 7270.41, + "db_value": 97.22 + }, + { + "pixel_x": 861, + "pixel_y": 256, + "frequency_hz": 7373.31, + "db_value": 97.02 + }, + { + "pixel_x": 864, + "pixel_y": 248, + "frequency_hz": 7530.41, + "db_value": 97.82 + }, + { + "pixel_x": 865, + "pixel_y": 249, + "frequency_hz": 7583.51, + "db_value": 97.72 + }, + { + "pixel_x": 866, + "pixel_y": 244, + "frequency_hz": 7636.99, + "db_value": 98.23 + }, + { + "pixel_x": 867, + "pixel_y": 245, + "frequency_hz": 7690.84, + "db_value": 98.12 + }, + { + "pixel_x": 868, + "pixel_y": 243, + "frequency_hz": 7745.08, + "db_value": 98.33 + }, + { + "pixel_x": 869, + "pixel_y": 241, + "frequency_hz": 7799.7, + "db_value": 98.53 + }, + { + "pixel_x": 870, + "pixel_y": 238, + "frequency_hz": 7854.7, + "db_value": 98.83 + }, + { + "pixel_x": 871, + "pixel_y": 233, + "frequency_hz": 7910.09, + "db_value": 99.33 + }, + { + "pixel_x": 872, + "pixel_y": 228, + "frequency_hz": 7965.87, + "db_value": 99.84 + }, + { + "pixel_x": 873, + "pixel_y": 222, + "frequency_hz": 8022.05, + "db_value": 100.44 + }, + { + "pixel_x": 874, + "pixel_y": 213, + "frequency_hz": 8078.62, + "db_value": 101.35 + }, + { + "pixel_x": 875, + "pixel_y": 224, + "frequency_hz": 8135.59, + "db_value": 100.24 + }, + { + "pixel_x": 877, + "pixel_y": 217, + "frequency_hz": 8250.74, + "db_value": 100.95 + }, + { + "pixel_x": 878, + "pixel_y": 221, + "frequency_hz": 8308.92, + "db_value": 100.54 + }, + { + "pixel_x": 879, + "pixel_y": 225, + "frequency_hz": 8367.52, + "db_value": 100.14 + }, + { + "pixel_x": 880, + "pixel_y": 230, + "frequency_hz": 8426.52, + "db_value": 99.64 + }, + { + "pixel_x": 881, + "pixel_y": 233, + "frequency_hz": 8485.95, + "db_value": 99.33 + }, + { + "pixel_x": 882, + "pixel_y": 236, + "frequency_hz": 8545.79, + "db_value": 99.03 + }, + { + "pixel_x": 883, + "pixel_y": 239, + "frequency_hz": 8606.06, + "db_value": 98.73 + }, + { + "pixel_x": 884, + "pixel_y": 241, + "frequency_hz": 8666.75, + "db_value": 98.53 + }, + { + "pixel_x": 885, + "pixel_y": 244, + "frequency_hz": 8727.86, + "db_value": 98.23 + }, + { + "pixel_x": 886, + "pixel_y": 247, + "frequency_hz": 8789.41, + "db_value": 97.92 + }, + { + "pixel_x": 887, + "pixel_y": 250, + "frequency_hz": 8851.39, + "db_value": 97.62 + }, + { + "pixel_x": 888, + "pixel_y": 254, + "frequency_hz": 8913.81, + "db_value": 97.22 + }, + { + "pixel_x": 889, + "pixel_y": 259, + "frequency_hz": 8976.67, + "db_value": 96.71 + }, + { + "pixel_x": 890, + "pixel_y": 264, + "frequency_hz": 9039.98, + "db_value": 96.21 + }, + { + "pixel_x": 891, + "pixel_y": 269, + "frequency_hz": 9103.73, + "db_value": 95.71 + }, + { + "pixel_x": 892, + "pixel_y": 273, + "frequency_hz": 9167.93, + "db_value": 95.3 + }, + { + "pixel_x": 893, + "pixel_y": 277, + "frequency_hz": 9232.58, + "db_value": 94.9 + }, + { + "pixel_x": 894, + "pixel_y": 282, + "frequency_hz": 9297.69, + "db_value": 94.4 + }, + { + "pixel_x": 895, + "pixel_y": 286, + "frequency_hz": 9363.25, + "db_value": 93.99 + }, + { + "pixel_x": 896, + "pixel_y": 292, + "frequency_hz": 9429.28, + "db_value": 93.39 + }, + { + "pixel_x": 897, + "pixel_y": 298, + "frequency_hz": 9495.78, + "db_value": 92.78 + }, + { + "pixel_x": 898, + "pixel_y": 304, + "frequency_hz": 9562.74, + "db_value": 92.18 + }, + { + "pixel_x": 899, + "pixel_y": 310, + "frequency_hz": 9630.18, + "db_value": 91.57 + }, + { + "pixel_x": 901, + "pixel_y": 302, + "frequency_hz": 9766.48, + "db_value": 92.38 + }, + { + "pixel_x": 902, + "pixel_y": 313, + "frequency_hz": 9835.35, + "db_value": 91.27 + }, + { + "pixel_x": 903, + "pixel_y": 304, + "frequency_hz": 9904.71, + "db_value": 92.18 + }, + { + "pixel_x": 904, + "pixel_y": 306, + "frequency_hz": 9974.56, + "db_value": 91.98 + }, + { + "pixel_x": 906, + "pixel_y": 302, + "frequency_hz": 10115.73, + "db_value": 92.38 + }, + { + "pixel_x": 907, + "pixel_y": 304, + "frequency_hz": 10187.07, + "db_value": 92.18 + }, + { + "pixel_x": 908, + "pixel_y": 309, + "frequency_hz": 10258.91, + "db_value": 91.67 + }, + { + "pixel_x": 909, + "pixel_y": 313, + "frequency_hz": 10331.26, + "db_value": 91.27 + }, + { + "pixel_x": 910, + "pixel_y": 318, + "frequency_hz": 10404.11, + "db_value": 90.77 + }, + { + "pixel_x": 911, + "pixel_y": 319, + "frequency_hz": 10477.48, + "db_value": 90.67 + }, + { + "pixel_x": 912, + "pixel_y": 319, + "frequency_hz": 10551.37, + "db_value": 90.67 + }, + { + "pixel_x": 914, + "pixel_y": 322, + "frequency_hz": 10700.71, + "db_value": 90.36 + }, + { + "pixel_x": 915, + "pixel_y": 317, + "frequency_hz": 10776.17, + "db_value": 90.87 + }, + { + "pixel_x": 916, + "pixel_y": 317, + "frequency_hz": 10852.16, + "db_value": 90.87 + }, + { + "pixel_x": 917, + "pixel_y": 313, + "frequency_hz": 10928.69, + "db_value": 91.27 + }, + { + "pixel_x": 918, + "pixel_y": 309, + "frequency_hz": 11005.76, + "db_value": 91.67 + }, + { + "pixel_x": 919, + "pixel_y": 304, + "frequency_hz": 11083.37, + "db_value": 92.18 + }, + { + "pixel_x": 920, + "pixel_y": 299, + "frequency_hz": 11161.53, + "db_value": 92.68 + }, + { + "pixel_x": 921, + "pixel_y": 294, + "frequency_hz": 11240.24, + "db_value": 93.19 + }, + { + "pixel_x": 922, + "pixel_y": 288, + "frequency_hz": 11319.51, + "db_value": 93.79 + }, + { + "pixel_x": 923, + "pixel_y": 282, + "frequency_hz": 11399.33, + "db_value": 94.4 + }, + { + "pixel_x": 924, + "pixel_y": 276, + "frequency_hz": 11479.72, + "db_value": 95.0 + }, + { + "pixel_x": 925, + "pixel_y": 269, + "frequency_hz": 11560.68, + "db_value": 95.71 + }, + { + "pixel_x": 926, + "pixel_y": 262, + "frequency_hz": 11642.2, + "db_value": 96.41 + }, + { + "pixel_x": 927, + "pixel_y": 256, + "frequency_hz": 11724.3, + "db_value": 97.02 + }, + { + "pixel_x": 928, + "pixel_y": 253, + "frequency_hz": 11806.98, + "db_value": 97.32 + }, + { + "pixel_x": 929, + "pixel_y": 253, + "frequency_hz": 11890.24, + "db_value": 97.32 + }, + { + "pixel_x": 934, + "pixel_y": 248, + "frequency_hz": 12315.45, + "db_value": 97.82 + }, + { + "pixel_x": 935, + "pixel_y": 248, + "frequency_hz": 12402.29, + "db_value": 97.82 + }, + { + "pixel_x": 936, + "pixel_y": 248, + "frequency_hz": 12489.75, + "db_value": 97.82 + }, + { + "pixel_x": 937, + "pixel_y": 245, + "frequency_hz": 12577.83, + "db_value": 98.12 + }, + { + "pixel_x": 938, + "pixel_y": 242, + "frequency_hz": 12666.53, + "db_value": 98.43 + }, + { + "pixel_x": 939, + "pixel_y": 239, + "frequency_hz": 12755.85, + "db_value": 98.73 + }, + { + "pixel_x": 940, + "pixel_y": 236, + "frequency_hz": 12845.81, + "db_value": 99.03 + }, + { + "pixel_x": 941, + "pixel_y": 233, + "frequency_hz": 12936.4, + "db_value": 99.33 + }, + { + "pixel_x": 942, + "pixel_y": 230, + "frequency_hz": 13027.62, + "db_value": 99.64 + }, + { + "pixel_x": 943, + "pixel_y": 229, + "frequency_hz": 13119.49, + "db_value": 99.74 + }, + { + "pixel_x": 945, + "pixel_y": 233, + "frequency_hz": 13305.18, + "db_value": 99.33 + }, + { + "pixel_x": 946, + "pixel_y": 232, + "frequency_hz": 13399.01, + "db_value": 99.44 + }, + { + "pixel_x": 947, + "pixel_y": 238, + "frequency_hz": 13493.5, + "db_value": 98.83 + }, + { + "pixel_x": 948, + "pixel_y": 249, + "frequency_hz": 13588.66, + "db_value": 97.72 + }, + { + "pixel_x": 949, + "pixel_y": 262, + "frequency_hz": 13684.48, + "db_value": 96.41 + }, + { + "pixel_x": 950, + "pixel_y": 278, + "frequency_hz": 13780.98, + "db_value": 94.8 + }, + { + "pixel_x": 951, + "pixel_y": 296, + "frequency_hz": 13878.17, + "db_value": 92.98 + }, + { + "pixel_x": 952, + "pixel_y": 314, + "frequency_hz": 13976.04, + "db_value": 91.17 + }, + { + "pixel_x": 953, + "pixel_y": 324, + "frequency_hz": 14074.59, + "db_value": 90.16 + }, + { + "pixel_x": 954, + "pixel_y": 309, + "frequency_hz": 14173.85, + "db_value": 91.67 + }, + { + "pixel_x": 955, + "pixel_y": 343, + "frequency_hz": 14273.8, + "db_value": 88.25 + }, + { + "pixel_x": 956, + "pixel_y": 329, + "frequency_hz": 14374.46, + "db_value": 89.66 + }, + { + "pixel_x": 957, + "pixel_y": 315, + "frequency_hz": 14475.83, + "db_value": 91.07 + }, + { + "pixel_x": 958, + "pixel_y": 304, + "frequency_hz": 14577.91, + "db_value": 92.18 + }, + { + "pixel_x": 959, + "pixel_y": 296, + "frequency_hz": 14680.71, + "db_value": 92.98 + }, + { + "pixel_x": 960, + "pixel_y": 298, + "frequency_hz": 14784.24, + "db_value": 92.78 + }, + { + "pixel_x": 962, + "pixel_y": 293, + "frequency_hz": 14993.49, + "db_value": 93.29 + }, + { + "pixel_x": 963, + "pixel_y": 290, + "frequency_hz": 15099.23, + "db_value": 93.59 + }, + { + "pixel_x": 964, + "pixel_y": 297, + "frequency_hz": 15205.71, + "db_value": 92.88 + }, + { + "pixel_x": 965, + "pixel_y": 299, + "frequency_hz": 15312.94, + "db_value": 92.68 + }, + { + "pixel_x": 966, + "pixel_y": 302, + "frequency_hz": 15420.92, + "db_value": 92.38 + }, + { + "pixel_x": 967, + "pixel_y": 305, + "frequency_hz": 15529.67, + "db_value": 92.08 + }, + { + "pixel_x": 968, + "pixel_y": 309, + "frequency_hz": 15639.19, + "db_value": 91.67 + }, + { + "pixel_x": 969, + "pixel_y": 315, + "frequency_hz": 15749.47, + "db_value": 91.07 + }, + { + "pixel_x": 970, + "pixel_y": 322, + "frequency_hz": 15860.54, + "db_value": 90.36 + }, + { + "pixel_x": 971, + "pixel_y": 330, + "frequency_hz": 15972.39, + "db_value": 89.56 + }, + { + "pixel_x": 972, + "pixel_y": 339, + "frequency_hz": 16085.02, + "db_value": 88.65 + }, + { + "pixel_x": 973, + "pixel_y": 344, + "frequency_hz": 16198.45, + "db_value": 88.15 + }, + { + "pixel_x": 974, + "pixel_y": 352, + "frequency_hz": 16312.68, + "db_value": 87.34 + }, + { + "pixel_x": 975, + "pixel_y": 345, + "frequency_hz": 16427.72, + "db_value": 88.04 + }, + { + "pixel_x": 976, + "pixel_y": 352, + "frequency_hz": 16543.57, + "db_value": 87.34 + }, + { + "pixel_x": 977, + "pixel_y": 350, + "frequency_hz": 16660.23, + "db_value": 87.54 + }, + { + "pixel_x": 978, + "pixel_y": 349, + "frequency_hz": 16777.72, + "db_value": 87.64 + }, + { + "pixel_x": 981, + "pixel_y": 345, + "frequency_hz": 17135.18, + "db_value": 88.04 + }, + { + "pixel_x": 982, + "pixel_y": 345, + "frequency_hz": 17256.01, + "db_value": 88.04 + }, + { + "pixel_x": 983, + "pixel_y": 343, + "frequency_hz": 17377.7, + "db_value": 88.25 + }, + { + "pixel_x": 984, + "pixel_y": 338, + "frequency_hz": 17500.25, + "db_value": 88.75 + }, + { + "pixel_x": 985, + "pixel_y": 333, + "frequency_hz": 17623.66, + "db_value": 89.25 + }, + { + "pixel_x": 986, + "pixel_y": 327, + "frequency_hz": 17747.94, + "db_value": 89.86 + }, + { + "pixel_x": 987, + "pixel_y": 322, + "frequency_hz": 17873.1, + "db_value": 90.36 + }, + { + "pixel_x": 988, + "pixel_y": 317, + "frequency_hz": 17999.14, + "db_value": 90.87 + }, + { + "pixel_x": 990, + "pixel_y": 324, + "frequency_hz": 18253.89, + "db_value": 90.16 + }, + { + "pixel_x": 991, + "pixel_y": 314, + "frequency_hz": 18382.62, + "db_value": 91.17 + }, + { + "pixel_x": 992, + "pixel_y": 323, + "frequency_hz": 18512.25, + "db_value": 90.26 + }, + { + "pixel_x": 993, + "pixel_y": 329, + "frequency_hz": 18642.8, + "db_value": 89.66 + }, + { + "pixel_x": 994, + "pixel_y": 337, + "frequency_hz": 18774.27, + "db_value": 88.85 + }, + { + "pixel_x": 995, + "pixel_y": 345, + "frequency_hz": 18906.67, + "db_value": 88.04 + }, + { + "pixel_x": 996, + "pixel_y": 352, + "frequency_hz": 19039.99, + "db_value": 87.34 + }, + { + "pixel_x": 998, + "pixel_y": 342, + "frequency_hz": 19309.48, + "db_value": 88.35 + }, + { + "pixel_x": 999, + "pixel_y": 348, + "frequency_hz": 19445.65, + "db_value": 87.74 + }, + { + "pixel_x": 1000, + "pixel_y": 343, + "frequency_hz": 19582.78, + "db_value": 88.25 + }, + { + "pixel_x": 1001, + "pixel_y": 335, + "frequency_hz": 19720.88, + "db_value": 89.05 + }, + { + "pixel_x": 1002, + "pixel_y": 337, + "frequency_hz": 19859.95, + "db_value": 88.85 + } + ] +} \ No newline at end of file diff --git a/frequency_response_points.csv b/frequency_response_points.csv new file mode 100644 index 0000000..b4491cb --- /dev/null +++ b/frequency_response_points.csv @@ -0,0 +1,535 @@ +index,x,y +1,278,236 +2,284,237 +3,285,236 +4,286,236 +5,287,238 +6,288,239 +7,289,236 +8,290,237 +9,295,237 +10,296,237 +11,297,238 +12,323,238 +13,324,237 +14,325,237 +15,334,238 +16,335,239 +17,339,240 +18,340,239 +19,341,239 +20,342,241 +21,343,242 +22,344,240 +23,345,241 +24,346,240 +25,347,241 +26,348,243 +27,349,242 +28,350,242 +29,352,244 +30,353,243 +31,354,243 +32,358,245 +33,359,244 +34,360,244 +35,361,246 +36,362,245 +37,363,245 +38,364,247 +39,365,248 +40,366,245 +41,367,247 +42,368,247 +43,369,248 +44,370,250 +45,371,248 +46,372,249 +47,373,249 +48,374,250 +49,375,250 +50,376,251 +51,377,251 +52,378,252 +53,379,252 +54,380,253 +55,381,253 +56,382,253 +57,383,255 +58,384,257 +59,385,255 +60,386,257 +61,387,259 +62,388,257 +63,389,257 +64,390,262 +65,391,262 +66,392,260 +67,393,260 +68,397,268 +69,398,266 +70,399,265 +71,408,278 +72,409,276 +73,410,275 +74,413,282 +75,414,282 +76,415,280 +77,416,282 +78,417,284 +79,418,283 +80,419,283 +81,420,284 +82,421,284 +83,422,285 +84,423,284 +85,424,285 +86,426,287 +87,427,288 +88,429,288 +89,430,287 +90,433,285 +91,434,284 +92,435,285 +93,436,284 +94,437,286 +95,438,284 +96,439,283 +97,440,283 +98,441,281 +99,442,282 +100,443,280 +101,444,281 +102,446,280 +103,447,278 +104,448,278 +105,449,278 +106,450,277 +107,451,279 +108,452,277 +109,453,276 +110,454,277 +111,455,275 +112,456,275 +113,457,275 +114,458,273 +115,459,276 +116,460,274 +117,461,272 +118,462,273 +119,463,272 +120,464,274 +121,465,272 +122,466,273 +123,467,270 +124,468,270 +125,469,269 +126,470,269 +127,471,268 +128,472,268 +129,473,267 +130,474,267 +131,475,268 +132,476,266 +133,477,264 +134,478,264 +135,479,264 +136,480,263 +137,481,263 +138,482,262 +139,483,262 +140,484,260 +141,485,261 +142,486,260 +143,487,260 +144,488,258 +145,489,259 +146,490,258 +147,491,260 +148,492,258 +149,493,256 +150,494,259 +151,495,257 +152,496,256 +153,497,257 +154,499,255 +155,500,255 +156,501,256 +157,502,254 +158,503,254 +159,504,255 +160,506,253 +161,507,253 +162,508,254 +163,513,253 +164,514,252 +165,519,252 +166,520,251 +167,537,251 +168,538,252 +169,541,253 +170,542,254 +171,543,251 +172,544,252 +173,545,254 +174,546,255 +175,547,252 +176,548,254 +177,549,256 +178,550,254 +179,551,255 +180,552,254 +181,553,256 +182,555,257 +183,556,259 +184,557,258 +185,558,258 +186,559,259 +187,560,259 +188,561,259 +189,562,261 +190,563,263 +191,564,262 +192,565,262 +193,566,263 +194,567,263 +195,568,266 +196,569,265 +197,570,267 +198,571,265 +199,572,266 +200,573,265 +201,574,267 +202,575,267 +203,576,268 +204,577,270 +205,578,267 +206,579,268 +207,580,270 +208,581,269 +209,582,269 +210,583,271 +211,584,272 +212,585,269 +213,586,271 +214,587,271 +215,588,272 +216,589,274 +217,590,271 +218,591,272 +219,595,272 +220,596,271 +221,597,272 +222,598,271 +223,599,271 +224,600,270 +225,601,270 +226,602,269 +227,603,269 +228,604,268 +229,605,270 +230,606,268 +231,607,266 +232,608,269 +233,609,268 +234,610,266 +235,611,266 +236,612,267 +237,613,265 +238,614,265 +239,615,266 +240,617,264 +241,618,264 +242,619,265 +243,628,263 +244,629,262 +245,630,265 +246,631,264 +247,632,262 +248,633,261 +249,634,264 +250,635,262 +251,636,260 +252,637,261 +253,638,260 +254,639,262 +255,640,260 +256,641,258 +257,642,259 +258,643,258 +259,644,260 +260,645,258 +261,646,256 +262,647,257 +263,648,256 +264,649,258 +265,650,256 +266,651,254 +267,652,255 +268,653,254 +269,654,254 +270,655,253 +271,656,253 +272,657,252 +273,658,252 +274,659,251 +275,660,251 +276,661,250 +277,662,250 +278,663,249 +279,664,249 +280,665,248 +281,666,248 +282,667,247 +283,668,249 +284,669,248 +285,674,246 +286,676,248 +287,677,242 +288,679,242 +289,681,239 +290,683,236 +291,685,233 +292,687,232 +293,688,226 +294,690,228 +295,692,221 +296,694,223 +297,696,216 +298,698,218 +299,699,213 +300,700,213 +301,701,213 +302,702,213 +303,703,214 +304,704,214 +305,705,213 +306,706,213 +307,708,210 +308,711,207 +309,712,207 +310,717,200 +311,718,197 +312,719,199 +313,720,197 +314,721,195 +315,722,195 +316,726,197 +317,727,194 +318,728,195 +319,729,195 +320,730,201 +321,731,198 +322,733,198 +323,734,198 +324,736,196 +325,738,195 +326,740,188 +327,741,188 +328,743,186 +329,744,186 +330,745,185 +331,746,187 +332,748,187 +333,749,188 +334,750,186 +335,751,186 +336,752,186 +337,760,198 +338,763,197 +339,774,213 +340,776,214 +341,777,218 +342,778,214 +343,779,219 +344,780,223 +345,781,220 +346,782,222 +347,783,222 +348,784,225 +349,785,224 +350,787,223 +351,789,227 +352,790,226 +353,791,227 +354,792,227 +355,793,232 +356,794,232 +357,795,231 +358,796,230 +359,797,231 +360,799,231 +361,800,230 +362,801,233 +363,802,232 +364,805,232 +365,806,233 +366,808,230 +367,810,227 +368,811,226 +369,812,220 +370,813,212 +371,814,204 +372,815,197 +373,816,192 +374,817,191 +375,818,186 +376,820,186 +377,821,190 +378,822,189 +379,823,192 +380,824,195 +381,825,198 +382,826,201 +383,827,205 +384,828,208 +385,829,212 +386,830,215 +387,831,218 +388,832,222 +389,833,225 +390,834,229 +391,835,231 +392,836,234 +393,837,237 +394,838,239 +395,839,241 +396,840,243 +397,841,245 +398,842,244 +399,843,249 +400,845,249 +401,850,259 +402,851,259 +403,852,258 +404,853,258 +405,854,259 +406,856,258 +407,857,261 +408,859,254 +409,861,256 +410,864,248 +411,865,249 +412,866,244 +413,867,245 +414,868,243 +415,869,241 +416,870,238 +417,871,233 +418,872,228 +419,873,222 +420,874,213 +421,875,224 +422,877,217 +423,878,221 +424,879,225 +425,880,230 +426,881,233 +427,882,236 +428,883,239 +429,884,241 +430,885,244 +431,886,247 +432,887,250 +433,888,254 +434,889,259 +435,890,264 +436,891,269 +437,892,273 +438,893,277 +439,894,282 +440,895,286 +441,896,292 +442,897,298 +443,898,304 +444,899,310 +445,901,302 +446,902,313 +447,903,304 +448,904,306 +449,906,302 +450,907,304 +451,908,309 +452,909,313 +453,910,318 +454,911,319 +455,912,319 +456,914,322 +457,915,317 +458,916,317 +459,917,313 +460,918,309 +461,919,304 +462,920,299 +463,921,294 +464,922,288 +465,923,282 +466,924,276 +467,925,269 +468,926,262 +469,927,256 +470,928,253 +471,929,253 +472,934,248 +473,935,248 +474,936,248 +475,937,245 +476,938,242 +477,939,239 +478,940,236 +479,941,233 +480,942,230 +481,943,229 +482,945,233 +483,946,232 +484,947,238 +485,948,249 +486,949,262 +487,950,278 +488,951,296 +489,952,314 +490,953,324 +491,954,309 +492,955,343 +493,956,329 +494,957,315 +495,958,304 +496,959,296 +497,960,298 +498,962,293 +499,963,290 +500,964,297 +501,965,299 +502,966,302 +503,967,305 +504,968,309 +505,969,315 +506,970,322 +507,971,330 +508,972,339 +509,973,344 +510,974,352 +511,975,345 +512,976,352 +513,977,350 +514,978,349 +515,981,345 +516,982,345 +517,983,343 +518,984,338 +519,985,333 +520,986,327 +521,987,322 +522,988,317 +523,990,324 +524,991,314 +525,992,323 +526,993,329 +527,994,337 +528,995,345 +529,996,352 +530,998,342 +531,999,348 +532,1000,343 +533,1001,335 +534,1002,337 diff --git a/frequency_response_points.json b/frequency_response_points.json new file mode 100644 index 0000000..c846e28 --- /dev/null +++ b/frequency_response_points.json @@ -0,0 +1,2150 @@ +{ + "frequency_points": [ + [ + 278, + 236 + ], + [ + 284, + 237 + ], + [ + 285, + 236 + ], + [ + 286, + 236 + ], + [ + 287, + 238 + ], + [ + 288, + 239 + ], + [ + 289, + 236 + ], + [ + 290, + 237 + ], + [ + 295, + 237 + ], + [ + 296, + 237 + ], + [ + 297, + 238 + ], + [ + 323, + 238 + ], + [ + 324, + 237 + ], + [ + 325, + 237 + ], + [ + 334, + 238 + ], + [ + 335, + 239 + ], + [ + 339, + 240 + ], + [ + 340, + 239 + ], + [ + 341, + 239 + ], + [ + 342, + 241 + ], + [ + 343, + 242 + ], + [ + 344, + 240 + ], + [ + 345, + 241 + ], + [ + 346, + 240 + ], + [ + 347, + 241 + ], + [ + 348, + 243 + ], + [ + 349, + 242 + ], + [ + 350, + 242 + ], + [ + 352, + 244 + ], + [ + 353, + 243 + ], + [ + 354, + 243 + ], + [ + 358, + 245 + ], + [ + 359, + 244 + ], + [ + 360, + 244 + ], + [ + 361, + 246 + ], + [ + 362, + 245 + ], + [ + 363, + 245 + ], + [ + 364, + 247 + ], + [ + 365, + 248 + ], + [ + 366, + 245 + ], + [ + 367, + 247 + ], + [ + 368, + 247 + ], + [ + 369, + 248 + ], + [ + 370, + 250 + ], + [ + 371, + 248 + ], + [ + 372, + 249 + ], + [ + 373, + 249 + ], + [ + 374, + 250 + ], + [ + 375, + 250 + ], + [ + 376, + 251 + ], + [ + 377, + 251 + ], + [ + 378, + 252 + ], + [ + 379, + 252 + ], + [ + 380, + 253 + ], + [ + 381, + 253 + ], + [ + 382, + 253 + ], + [ + 383, + 255 + ], + [ + 384, + 257 + ], + [ + 385, + 255 + ], + [ + 386, + 257 + ], + [ + 387, + 259 + ], + [ + 388, + 257 + ], + [ + 389, + 257 + ], + [ + 390, + 262 + ], + [ + 391, + 262 + ], + [ + 392, + 260 + ], + [ + 393, + 260 + ], + [ + 397, + 268 + ], + [ + 398, + 266 + ], + [ + 399, + 265 + ], + [ + 408, + 278 + ], + [ + 409, + 276 + ], + [ + 410, + 275 + ], + [ + 413, + 282 + ], + [ + 414, + 282 + ], + [ + 415, + 280 + ], + [ + 416, + 282 + ], + [ + 417, + 284 + ], + [ + 418, + 283 + ], + [ + 419, + 283 + ], + [ + 420, + 284 + ], + [ + 421, + 284 + ], + [ + 422, + 285 + ], + [ + 423, + 284 + ], + [ + 424, + 285 + ], + [ + 426, + 287 + ], + [ + 427, + 288 + ], + [ + 429, + 288 + ], + [ + 430, + 287 + ], + [ + 433, + 285 + ], + [ + 434, + 284 + ], + [ + 435, + 285 + ], + [ + 436, + 284 + ], + [ + 437, + 286 + ], + [ + 438, + 284 + ], + [ + 439, + 283 + ], + [ + 440, + 283 + ], + [ + 441, + 281 + ], + [ + 442, + 282 + ], + [ + 443, + 280 + ], + [ + 444, + 281 + ], + [ + 446, + 280 + ], + [ + 447, + 278 + ], + [ + 448, + 278 + ], + [ + 449, + 278 + ], + [ + 450, + 277 + ], + [ + 451, + 279 + ], + [ + 452, + 277 + ], + [ + 453, + 276 + ], + [ + 454, + 277 + ], + [ + 455, + 275 + ], + [ + 456, + 275 + ], + [ + 457, + 275 + ], + [ + 458, + 273 + ], + [ + 459, + 276 + ], + [ + 460, + 274 + ], + [ + 461, + 272 + ], + [ + 462, + 273 + ], + [ + 463, + 272 + ], + [ + 464, + 274 + ], + [ + 465, + 272 + ], + [ + 466, + 273 + ], + [ + 467, + 270 + ], + [ + 468, + 270 + ], + [ + 469, + 269 + ], + [ + 470, + 269 + ], + [ + 471, + 268 + ], + [ + 472, + 268 + ], + [ + 473, + 267 + ], + [ + 474, + 267 + ], + [ + 475, + 268 + ], + [ + 476, + 266 + ], + [ + 477, + 264 + ], + [ + 478, + 264 + ], + [ + 479, + 264 + ], + [ + 480, + 263 + ], + [ + 481, + 263 + ], + [ + 482, + 262 + ], + [ + 483, + 262 + ], + [ + 484, + 260 + ], + [ + 485, + 261 + ], + [ + 486, + 260 + ], + [ + 487, + 260 + ], + [ + 488, + 258 + ], + [ + 489, + 259 + ], + [ + 490, + 258 + ], + [ + 491, + 260 + ], + [ + 492, + 258 + ], + [ + 493, + 256 + ], + [ + 494, + 259 + ], + [ + 495, + 257 + ], + [ + 496, + 256 + ], + [ + 497, + 257 + ], + [ + 499, + 255 + ], + [ + 500, + 255 + ], + [ + 501, + 256 + ], + [ + 502, + 254 + ], + [ + 503, + 254 + ], + [ + 504, + 255 + ], + [ + 506, + 253 + ], + [ + 507, + 253 + ], + [ + 508, + 254 + ], + [ + 513, + 253 + ], + [ + 514, + 252 + ], + [ + 519, + 252 + ], + [ + 520, + 251 + ], + [ + 537, + 251 + ], + [ + 538, + 252 + ], + [ + 541, + 253 + ], + [ + 542, + 254 + ], + [ + 543, + 251 + ], + [ + 544, + 252 + ], + [ + 545, + 254 + ], + [ + 546, + 255 + ], + [ + 547, + 252 + ], + [ + 548, + 254 + ], + [ + 549, + 256 + ], + [ + 550, + 254 + ], + [ + 551, + 255 + ], + [ + 552, + 254 + ], + [ + 553, + 256 + ], + [ + 555, + 257 + ], + [ + 556, + 259 + ], + [ + 557, + 258 + ], + [ + 558, + 258 + ], + [ + 559, + 259 + ], + [ + 560, + 259 + ], + [ + 561, + 259 + ], + [ + 562, + 261 + ], + [ + 563, + 263 + ], + [ + 564, + 262 + ], + [ + 565, + 262 + ], + [ + 566, + 263 + ], + [ + 567, + 263 + ], + [ + 568, + 266 + ], + [ + 569, + 265 + ], + [ + 570, + 267 + ], + [ + 571, + 265 + ], + [ + 572, + 266 + ], + [ + 573, + 265 + ], + [ + 574, + 267 + ], + [ + 575, + 267 + ], + [ + 576, + 268 + ], + [ + 577, + 270 + ], + [ + 578, + 267 + ], + [ + 579, + 268 + ], + [ + 580, + 270 + ], + [ + 581, + 269 + ], + [ + 582, + 269 + ], + [ + 583, + 271 + ], + [ + 584, + 272 + ], + [ + 585, + 269 + ], + [ + 586, + 271 + ], + [ + 587, + 271 + ], + [ + 588, + 272 + ], + [ + 589, + 274 + ], + [ + 590, + 271 + ], + [ + 591, + 272 + ], + [ + 595, + 272 + ], + [ + 596, + 271 + ], + [ + 597, + 272 + ], + [ + 598, + 271 + ], + [ + 599, + 271 + ], + [ + 600, + 270 + ], + [ + 601, + 270 + ], + [ + 602, + 269 + ], + [ + 603, + 269 + ], + [ + 604, + 268 + ], + [ + 605, + 270 + ], + [ + 606, + 268 + ], + [ + 607, + 266 + ], + [ + 608, + 269 + ], + [ + 609, + 268 + ], + [ + 610, + 266 + ], + [ + 611, + 266 + ], + [ + 612, + 267 + ], + [ + 613, + 265 + ], + [ + 614, + 265 + ], + [ + 615, + 266 + ], + [ + 617, + 264 + ], + [ + 618, + 264 + ], + [ + 619, + 265 + ], + [ + 628, + 263 + ], + [ + 629, + 262 + ], + [ + 630, + 265 + ], + [ + 631, + 264 + ], + [ + 632, + 262 + ], + [ + 633, + 261 + ], + [ + 634, + 264 + ], + [ + 635, + 262 + ], + [ + 636, + 260 + ], + [ + 637, + 261 + ], + [ + 638, + 260 + ], + [ + 639, + 262 + ], + [ + 640, + 260 + ], + [ + 641, + 258 + ], + [ + 642, + 259 + ], + [ + 643, + 258 + ], + [ + 644, + 260 + ], + [ + 645, + 258 + ], + [ + 646, + 256 + ], + [ + 647, + 257 + ], + [ + 648, + 256 + ], + [ + 649, + 258 + ], + [ + 650, + 256 + ], + [ + 651, + 254 + ], + [ + 652, + 255 + ], + [ + 653, + 254 + ], + [ + 654, + 254 + ], + [ + 655, + 253 + ], + [ + 656, + 253 + ], + [ + 657, + 252 + ], + [ + 658, + 252 + ], + [ + 659, + 251 + ], + [ + 660, + 251 + ], + [ + 661, + 250 + ], + [ + 662, + 250 + ], + [ + 663, + 249 + ], + [ + 664, + 249 + ], + [ + 665, + 248 + ], + [ + 666, + 248 + ], + [ + 667, + 247 + ], + [ + 668, + 249 + ], + [ + 669, + 248 + ], + [ + 674, + 246 + ], + [ + 676, + 248 + ], + [ + 677, + 242 + ], + [ + 679, + 242 + ], + [ + 681, + 239 + ], + [ + 683, + 236 + ], + [ + 685, + 233 + ], + [ + 687, + 232 + ], + [ + 688, + 226 + ], + [ + 690, + 228 + ], + [ + 692, + 221 + ], + [ + 694, + 223 + ], + [ + 696, + 216 + ], + [ + 698, + 218 + ], + [ + 699, + 213 + ], + [ + 700, + 213 + ], + [ + 701, + 213 + ], + [ + 702, + 213 + ], + [ + 703, + 214 + ], + [ + 704, + 214 + ], + [ + 705, + 213 + ], + [ + 706, + 213 + ], + [ + 708, + 210 + ], + [ + 711, + 207 + ], + [ + 712, + 207 + ], + [ + 717, + 200 + ], + [ + 718, + 197 + ], + [ + 719, + 199 + ], + [ + 720, + 197 + ], + [ + 721, + 195 + ], + [ + 722, + 195 + ], + [ + 726, + 197 + ], + [ + 727, + 194 + ], + [ + 728, + 195 + ], + [ + 729, + 195 + ], + [ + 730, + 201 + ], + [ + 731, + 198 + ], + [ + 733, + 198 + ], + [ + 734, + 198 + ], + [ + 736, + 196 + ], + [ + 738, + 195 + ], + [ + 740, + 188 + ], + [ + 741, + 188 + ], + [ + 743, + 186 + ], + [ + 744, + 186 + ], + [ + 745, + 185 + ], + [ + 746, + 187 + ], + [ + 748, + 187 + ], + [ + 749, + 188 + ], + [ + 750, + 186 + ], + [ + 751, + 186 + ], + [ + 752, + 186 + ], + [ + 760, + 198 + ], + [ + 763, + 197 + ], + [ + 774, + 213 + ], + [ + 776, + 214 + ], + [ + 777, + 218 + ], + [ + 778, + 214 + ], + [ + 779, + 219 + ], + [ + 780, + 223 + ], + [ + 781, + 220 + ], + [ + 782, + 222 + ], + [ + 783, + 222 + ], + [ + 784, + 225 + ], + [ + 785, + 224 + ], + [ + 787, + 223 + ], + [ + 789, + 227 + ], + [ + 790, + 226 + ], + [ + 791, + 227 + ], + [ + 792, + 227 + ], + [ + 793, + 232 + ], + [ + 794, + 232 + ], + [ + 795, + 231 + ], + [ + 796, + 230 + ], + [ + 797, + 231 + ], + [ + 799, + 231 + ], + [ + 800, + 230 + ], + [ + 801, + 233 + ], + [ + 802, + 232 + ], + [ + 805, + 232 + ], + [ + 806, + 233 + ], + [ + 808, + 230 + ], + [ + 810, + 227 + ], + [ + 811, + 226 + ], + [ + 812, + 220 + ], + [ + 813, + 212 + ], + [ + 814, + 204 + ], + [ + 815, + 197 + ], + [ + 816, + 192 + ], + [ + 817, + 191 + ], + [ + 818, + 186 + ], + [ + 820, + 186 + ], + [ + 821, + 190 + ], + [ + 822, + 189 + ], + [ + 823, + 192 + ], + [ + 824, + 195 + ], + [ + 825, + 198 + ], + [ + 826, + 201 + ], + [ + 827, + 205 + ], + [ + 828, + 208 + ], + [ + 829, + 212 + ], + [ + 830, + 215 + ], + [ + 831, + 218 + ], + [ + 832, + 222 + ], + [ + 833, + 225 + ], + [ + 834, + 229 + ], + [ + 835, + 231 + ], + [ + 836, + 234 + ], + [ + 837, + 237 + ], + [ + 838, + 239 + ], + [ + 839, + 241 + ], + [ + 840, + 243 + ], + [ + 841, + 245 + ], + [ + 842, + 244 + ], + [ + 843, + 249 + ], + [ + 845, + 249 + ], + [ + 850, + 259 + ], + [ + 851, + 259 + ], + [ + 852, + 258 + ], + [ + 853, + 258 + ], + [ + 854, + 259 + ], + [ + 856, + 258 + ], + [ + 857, + 261 + ], + [ + 859, + 254 + ], + [ + 861, + 256 + ], + [ + 864, + 248 + ], + [ + 865, + 249 + ], + [ + 866, + 244 + ], + [ + 867, + 245 + ], + [ + 868, + 243 + ], + [ + 869, + 241 + ], + [ + 870, + 238 + ], + [ + 871, + 233 + ], + [ + 872, + 228 + ], + [ + 873, + 222 + ], + [ + 874, + 213 + ], + [ + 875, + 224 + ], + [ + 877, + 217 + ], + [ + 878, + 221 + ], + [ + 879, + 225 + ], + [ + 880, + 230 + ], + [ + 881, + 233 + ], + [ + 882, + 236 + ], + [ + 883, + 239 + ], + [ + 884, + 241 + ], + [ + 885, + 244 + ], + [ + 886, + 247 + ], + [ + 887, + 250 + ], + [ + 888, + 254 + ], + [ + 889, + 259 + ], + [ + 890, + 264 + ], + [ + 891, + 269 + ], + [ + 892, + 273 + ], + [ + 893, + 277 + ], + [ + 894, + 282 + ], + [ + 895, + 286 + ], + [ + 896, + 292 + ], + [ + 897, + 298 + ], + [ + 898, + 304 + ], + [ + 899, + 310 + ], + [ + 901, + 302 + ], + [ + 902, + 313 + ], + [ + 903, + 304 + ], + [ + 904, + 306 + ], + [ + 906, + 302 + ], + [ + 907, + 304 + ], + [ + 908, + 309 + ], + [ + 909, + 313 + ], + [ + 910, + 318 + ], + [ + 911, + 319 + ], + [ + 912, + 319 + ], + [ + 914, + 322 + ], + [ + 915, + 317 + ], + [ + 916, + 317 + ], + [ + 917, + 313 + ], + [ + 918, + 309 + ], + [ + 919, + 304 + ], + [ + 920, + 299 + ], + [ + 921, + 294 + ], + [ + 922, + 288 + ], + [ + 923, + 282 + ], + [ + 924, + 276 + ], + [ + 925, + 269 + ], + [ + 926, + 262 + ], + [ + 927, + 256 + ], + [ + 928, + 253 + ], + [ + 929, + 253 + ], + [ + 934, + 248 + ], + [ + 935, + 248 + ], + [ + 936, + 248 + ], + [ + 937, + 245 + ], + [ + 938, + 242 + ], + [ + 939, + 239 + ], + [ + 940, + 236 + ], + [ + 941, + 233 + ], + [ + 942, + 230 + ], + [ + 943, + 229 + ], + [ + 945, + 233 + ], + [ + 946, + 232 + ], + [ + 947, + 238 + ], + [ + 948, + 249 + ], + [ + 949, + 262 + ], + [ + 950, + 278 + ], + [ + 951, + 296 + ], + [ + 952, + 314 + ], + [ + 953, + 324 + ], + [ + 954, + 309 + ], + [ + 955, + 343 + ], + [ + 956, + 329 + ], + [ + 957, + 315 + ], + [ + 958, + 304 + ], + [ + 959, + 296 + ], + [ + 960, + 298 + ], + [ + 962, + 293 + ], + [ + 963, + 290 + ], + [ + 964, + 297 + ], + [ + 965, + 299 + ], + [ + 966, + 302 + ], + [ + 967, + 305 + ], + [ + 968, + 309 + ], + [ + 969, + 315 + ], + [ + 970, + 322 + ], + [ + 971, + 330 + ], + [ + 972, + 339 + ], + [ + 973, + 344 + ], + [ + 974, + 352 + ], + [ + 975, + 345 + ], + [ + 976, + 352 + ], + [ + 977, + 350 + ], + [ + 978, + 349 + ], + [ + 981, + 345 + ], + [ + 982, + 345 + ], + [ + 983, + 343 + ], + [ + 984, + 338 + ], + [ + 985, + 333 + ], + [ + 986, + 327 + ], + [ + 987, + 322 + ], + [ + 988, + 317 + ], + [ + 990, + 324 + ], + [ + 991, + 314 + ], + [ + 992, + 323 + ], + [ + 993, + 329 + ], + [ + 994, + 337 + ], + [ + 995, + 345 + ], + [ + 996, + 352 + ], + [ + 998, + 342 + ], + [ + 999, + 348 + ], + [ + 1000, + 343 + ], + [ + 1001, + 335 + ], + [ + 1002, + 337 + ] + ], + "chart_area": { + "top": 28, + "bottom": 524, + "left": 20, + "right": 1003 + }, + "image_size": { + "width": 1024, + "height": 570 + } +} \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..9a2901a --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,31 @@ +FROM node:18-alpine AS builder + +WORKDIR /app + +# Install pnpm +RUN npm install -g pnpm + +# Copy package files +COPY package.json pnpm-lock.yaml* ./ + +# Install dependencies +RUN pnpm install --frozen-lockfile || pnpm install + +# Copy source code +COPY . . + +# Build the application +RUN pnpm build + +# Production stage +FROM nginx:alpine + +# Copy built assets from builder stage +COPY --from=builder /app/dist /usr/share/nginx/html + +# Copy nginx configuration +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/frontend/README.md b/frontend/README.md index 7c30664..1f3c3a3 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -92,19 +92,19 @@ pnpm build 开发服务器已配置代理,将 `/api` 请求转发到后端服务: - 前端请求:`/api/brands/` -- 后端地址:`http://localhost:8002/api/brands/` +- 后端地址:`http://localhost:8083/api/brands/` 配置位于 `vite.config.js` ## 注意事项 1. **确保后端服务已启动** - - 后端运行在 http://localhost:8002 + - 后端运行在 http://localhost:8083 - 使用 `backend/restart.bat` 重启后端服务 2. **端口占用** - 前端使用 3000 端口 - - 后端使用 8002 端口 + - 后端使用 8083 端口 - 如果端口被占用,请修改相应配置文件 3. **跨域问题** diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..8666971 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,30 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + # API proxy to backend + location /api { + proxy_pass http://backend:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Handle Vue Router history mode + location / { + try_files $uri $uri/ /index.html; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} diff --git a/frontend/package.json b/frontend/package.json index 9ec0a6c..032b4a0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,7 +11,8 @@ "vue": "^3.3.4", "vue-router": "^4.2.4", "axios": "^1.5.0", - "element-plus": "^2.3.14" + "element-plus": "^2.3.14", + "@element-plus/icons-vue": "^2.1.0" }, "devDependencies": { "@vitejs/plugin-vue": "^4.3.4", diff --git a/frontend/src/api/model.js b/frontend/src/api/model.js index 64e0dae..766344d 100644 --- a/frontend/src/api/model.js +++ b/frontend/src/api/model.js @@ -29,26 +29,31 @@ export function getModel(id) { /** * 创建型号 - * @param {Object} data - 型号数据 + * @param {Object} data - 型号数据或 FormData + * @param {Object} config - 额外配置 + * @param {boolean} config.isFormData - 是否为 FormData 上传 */ -export function createModel(data) { +export function createModel(data, config = {}) { return request({ url: '/models/', method: 'post', - data + data, + headers: config.isFormData ? { 'Content-Type': 'multipart/form-data' } : {} }) } /** * 更新型号 - * @param {Object} data - 型号数据 - * @param {number} data.id - 型号 ID + * @param {Object} data - 型号数据或 FormData + * @param {Object} config - 额外配置 + * @param {boolean} config.isFormData - 是否为 FormData 上传 */ -export function updateModel(data) { +export function updateModel(data, config = {}) { return request({ - url: `/models/${data.id}`, + url: `/models/${data.id || data.get('id')}`, method: 'put', - data + data, + headers: config.isFormData ? { 'Content-Type': 'multipart/form-data' } : {} }) } diff --git a/frontend/src/views/model/index.vue b/frontend/src/views/model/index.vue index b9c3114..bb74dd8 100644 --- a/frontend/src/views/model/index.vue +++ b/frontend/src/views/model/index.vue @@ -80,7 +80,7 @@ - +